Russian Qt Forum
Июля 04, 2025, 07:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: доступ к объекту MainWindow  (Прочитано 12291 раз)
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

Сообщений: 4747



Просмотр профиля 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

Сообщений: 4747



Просмотр профиля 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

Сообщений: 5877


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


Просмотр профиля 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

Сообщений: 5877


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


Просмотр профиля 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

Сообщений: 5877


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


Просмотр профиля 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

Сообщений: 5877


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


Просмотр профиля 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.023 секунд. Запросов: 20.