Russian Qt Forum
Май 05, 2024, 20:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: доступ к объекту MainWindow  (Прочитано 11524 раз)
DDDIM
Гость
« : Июль 13, 2011, 12:41 »

бъюсь со следующей турдностью:
пытаюсь получить доступ к переменной объекта главного окна из других окон.
видимо недостаточно понимаю как работает препроцессор, а именно #include.
работаю на qt creator
прошу помощи по этому вопросу.

код:

main.cpp
Код:
#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    w.show();  // объявление  MainWindow w; вынес в mainwindow.h

    return a.exec();
}

mainwindow.h
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    int i;  // переменная к которой хочу получить доступ
private:
    Ui::MainWindow *ui;
};

    MainWindow w;  // объявляю экземпляр класса mainWindow

#endif // MAINWINDOW_H

form.h
Код:
#ifndef FORM_H
#define FORM_H

#include <QWidget>
#include "mainwindow.h" // хочу видеть класс MainWindow и его экземпляр w, который создается в main.cpp

namespace Ui {
    class Form;
}

class Form : public QWidget
{
    Q_OBJECT

public:
    explicit Form(QWidget *parent = 0);
    ~Form();

private:
    Ui::Form *ui;
};

#endif // FORM_H

form.cpp
Код:
#include "form.h"
#include "ui_form.h"

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);
    w.i = 123; // при создании формы Form хочу чтобы изменялась переменная i объекта w главного окна
}

Form::~Form()
{
    delete ui;
}


компилятор выдает ошибку multiple definition of 'w';
« Последнее редактирование: Июль 13, 2011, 12:46 от DDDIM » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #1 : Июль 13, 2011, 13:16 »

форма Form создается в каком-то методе главного окна я так понимаю, вот там и менять i. к переменной w ты никак не получишь доступ кроме как в функции main()
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Июль 13, 2011, 13:17 »

>>w.show();  // объявление  MainWindow w; вынес в mainwindow.h
категорически зря.
Записан

Юра.
DDDIM
Гость
« Ответ #3 : Июль 13, 2011, 13:32 »

форма Form создается в каком-то методе главного окна я так понимаю, вот там и менять i. к переменной w ты никак не получишь доступ кроме как в функции main()

это был простейший пример того что мне надо сделать. в реальной программе нужно получать доступ к главному окну из всех его дочерних окон. сигналы и слоты не подходят. уже не первый день ломаю над этим голову. приложение должно быть построено так, чтобы все виждеты(пусть, не все, но многие) могли получать доступ ко всему классу главного окна. должно быть простое решение этого вопроса. говорить что это не правильно с точки зрения правильного программирования и т.п. не обязательно. просто кто знает подскажите пожалуйста решение. Непонимающий
« Последнее редактирование: Июль 13, 2011, 13:39 от DDDIM » Записан
DDDIM
Гость
« Ответ #4 : Июль 13, 2011, 13:47 »

>>w.show();  // объявление  MainWindow w; вынес в mainwindow.h
категорически зря.


почему зря? если объявление w останется в main(...){...} то этот объект не увидят другие классы
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #5 : Июль 13, 2011, 13:53 »

extern MainWindow w; - в .h
MainWindow w; - в .cpp
И будет вам полный Delphi Style. Подмигивающий
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #6 : Июль 13, 2011, 14:12 »

может тогда синглтон использовать для главного окна?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Июль 13, 2011, 14:18 »

1. Используй сигналы/слоты
2. Передавай в Form указатель на MainWindow
3. Еще много способов
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
DDDIM
Гость
« Ответ #8 : Июль 13, 2011, 14:29 »

extern MainWindow w; - в .h
MainWindow w; - в .cpp
И будет вам полный Delphi Style. Подмигивающий

последовал вашему совету. не хочет работать.

main.cpp
Код:
#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
   
    w.show();

    return a.exec();
}

mainwindow.h
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    int i;
private:
    Ui::MainWindow *ui;
};

MainWindow w;

#endif // MAINWINDOW_H

mainwindow.cpp
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

form.h
Код:
#ifndef FORM_H
#define FORM_H

#include <QWidget>
#include "mainwindow.h"


extern MainWindow w;

namespace Ui {
    class Form;
}

class Form : public QWidget
{
    Q_OBJECT

public:
    explicit Form(QWidget *parent = 0);
    ~Form();

private:
    Ui::Form *ui;
};

#endif // FORM_H

form.cpp
Код:
#include "form.h"
#include "ui_form.h"

MainWindow w;

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);
}

Form::~Form()
{
    delete ui;
}

оно и не должно работать. потому что два объявления w. одно в mainwindow.h другое в form.cpp.
если же поставить эти объявления в mainwindow.h и mainwindow.cpp, то программа сама завершается сразу после старта. возможно, я недопонял куда добавлять предложенные объявления. не могли бы расшифровать на моем коде например.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Июль 13, 2011, 14:31 »

DDDIM, тебе нужно сначала поучить с++, а потом уже за Qt браться. Искренне советую.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
DDDIM
Гость
« Ответ #10 : Июль 13, 2011, 14:35 »

1. Используй сигналы/слоты
2. Передавай в Form указатель на MainWindow
3. Еще много способов

спасибо за советы 1-2. третий не помог))) мне бы хоть один сопсоб осуществить.
второй способ я пытался осуществить, но как уже писал, по-видимому, не могу врубиться как работает #include. если вас не затруднит, можно пример на моем коде?

согласен, изучение c++ в процессе.
на c писал большую программу, думал быстро адаптируюсь.
« Последнее редактирование: Июль 13, 2011, 14:36 от DDDIM » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #11 : Июль 13, 2011, 14:37 »

Тебе лучше посмотреть примеры и туториалы, которые поставляются вместе с Qt. А еще лучше - почитай в книжке.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
DDDIM
Гость
« Ответ #12 : Июль 13, 2011, 14:39 »

может тогда синглтон использовать для главного окна?

спасибо. впервые вижу этот термин. начал читать
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #13 : Июль 13, 2011, 14:40 »

может тогда синглтон использовать для главного окна?

спасибо. впервые вижу этот термин. начал читать
Тут синглтон не нужен.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
DDDIM
Гость
« Ответ #14 : Июль 13, 2011, 15:33 »

extern MainWindow w; - в .h
MainWindow w; - в .cpp
И будет вам полный Delphi Style. Подмигивающий

спасибо заработало.
моя невнимательность.
для создания объекта в main.cpp надо было использовать

Код:
    
w = new MainWindow();
w->show();


при этом

extern MainWindow *w; - в .h
MainWindow *w; - в .cpp - иначе уже тут создается объект и программа вылетает с ошибкой
Код:
QWidget: Must construct a QApplication before a QPaintDevice
Программа неожиданно завершилась.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.126 секунд. Запросов: 22.