Russian Qt Forum

Qt => Вопросы новичков => Тема начата: DDDIM от Июля 13, 2011, 12:41



Название: доступ к объекту MainWindow
Отправлено: 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';


Название: Re: доступ к объекту MainWindow
Отправлено: kambala от Июля 13, 2011, 13:16
форма Form создается в каком-то методе главного окна я так понимаю, вот там и менять i. к переменной w ты никак не получишь доступ кроме как в функции main()


Название: Re: доступ к объекту MainWindow
Отправлено: lit-uriy от Июля 13, 2011, 13:17
>>w.show();  // объявление  MainWindow w; вынес в mainwindow.h
категорически зря.


Название: Re: доступ к объекту MainWindow
Отправлено: DDDIM от Июля 13, 2011, 13:32
форма Form создается в каком-то методе главного окна я так понимаю, вот там и менять i. к переменной w ты никак не получишь доступ кроме как в функции main()

это был простейший пример того что мне надо сделать. в реальной программе нужно получать доступ к главному окну из всех его дочерних окон. сигналы и слоты не подходят. уже не первый день ломаю над этим голову. приложение должно быть построено так, чтобы все виждеты(пусть, не все, но многие) могли получать доступ ко всему классу главного окна. должно быть простое решение этого вопроса. говорить что это не правильно с точки зрения правильного программирования и т.п. не обязательно. просто кто знает подскажите пожалуйста решение. ???


Название: Re: доступ к объекту MainWindow
Отправлено: DDDIM от Июля 13, 2011, 13:47
>>w.show();  // объявление  MainWindow w; вынес в mainwindow.h
категорически зря.


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


Название: Re: доступ к объекту MainWindow
Отправлено: LisandreL от Июля 13, 2011, 13:53
extern MainWindow w; - в .h
MainWindow w; - в .cpp
И будет вам полный Delphi Style. ;)


Название: Re: доступ к объекту MainWindow
Отправлено: kambala от Июля 13, 2011, 14:12
может тогда синглтон использовать для главного окна?


Название: Re: доступ к объекту MainWindow
Отправлено: Пантер от Июля 13, 2011, 14:18
1. Используй сигналы/слоты
2. Передавай в Form указатель на MainWindow
3. Еще много способов


Название: Re: доступ к объекту MainWindow
Отправлено: DDDIM от Июля 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, то программа сама завершается сразу после старта. возможно, я недопонял куда добавлять предложенные объявления. не могли бы расшифровать на моем коде например.


Название: Re: доступ к объекту MainWindow
Отправлено: Пантер от Июля 13, 2011, 14:31
DDDIM, тебе нужно сначала поучить с++, а потом уже за Qt браться. Искренне советую.


Название: Re: доступ к объекту MainWindow
Отправлено: DDDIM от Июля 13, 2011, 14:35
1. Используй сигналы/слоты
2. Передавай в Form указатель на MainWindow
3. Еще много способов

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

согласен, изучение c++ в процессе.
на c писал большую программу, думал быстро адаптируюсь.


Название: Re: доступ к объекту MainWindow
Отправлено: Пантер от Июля 13, 2011, 14:37
Тебе лучше посмотреть примеры и туториалы, которые поставляются вместе с Qt. А еще лучше - почитай в книжке.


Название: Re: доступ к объекту MainWindow
Отправлено: DDDIM от Июля 13, 2011, 14:39
может тогда синглтон использовать для главного окна?

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


Название: Re: доступ к объекту MainWindow
Отправлено: Пантер от Июля 13, 2011, 14:40
может тогда синглтон использовать для главного окна?

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


Название: Re: доступ к объекту MainWindow
Отправлено: DDDIM от Июля 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
Программа неожиданно завершилась.


Название: Re: доступ к объекту MainWindow
Отправлено: lit-uriy от Июля 14, 2011, 19:20
>>почему зря?
потому что так не программируют в принципе (заисключением богландов). в заголовочниках не следует создавать объекты.

Богландам так было легче генерить их Сибилдеровские хахаряхи из дельфийского кода.