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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Общение между двумя объектами!  (Прочитано 11204 раз)
Racot
Гость
« : Апрель 14, 2012, 15:59 »

Код:
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow1 *w = new MainWindow1();
    MainWindow2 *w2 = new MainWindow2();

    w->show();

    return a.exec();
}

У меня есть 2 формы классов MainWindow1 и MainWindow2.На каждой есть по кнопке, по нажатию которой должна появляется другая форма, а эта скрывается. То есть в слоте обработки нажатия на кнопку должно быть примерно так:
Код:
void MainWindow1::on_pushButton_clicked()
{
  w2->show();
  w1->hide(); 
}

но класс MainWindow1 ничего же не знает о объекте w2. Как это делается? Можно MainWindow1 *w и
MainWindow2 *w2 объявлять глобально.Но я читал что  это не правильно.(тем более допустим в java нет глобальных переменных, но там же как то это реализовывается). В общем кто реализовывал многооконные интерфейсы - помогите!!
Записан
alexis031182
Гость
« Ответ #1 : Апрель 14, 2012, 16:19 »

Вам нужно просто в обоих объектах класса MainWindow сохранять указатели друг на друга. Напишите в MainWindow функцию, например:
Код:
void MainWindow::setCorrespondingWindow(MainWindow *mw)
{
_mw = mw;
}
А в заголовочном mainwindow.h объявите указатель на объект:
Код:
MainWindow _mw;
Как только создадите объекты обоих окон, выполните для каждого вышеуказанную функцию, которая и предоставит доступ каждого окна к другому.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #2 : Апрель 14, 2012, 16:29 »

как по мне, лучше это делать через отдельный класс-менеджер
Записан

Изучением 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
Racot
Гость
« Ответ #3 : Апрель 14, 2012, 16:46 »

Как только создаю в каждом из классов указатели друг на друга.....то компилятор мне выдаёт -

Цитировать
..\Temp_pro\/mainwindow2.h:15: error: ISO C++ forbids declaration of 'MainWindow1' with no type
..\Temp_pro\/mainwindow2.h:15: error: expected ';' before '*' token

alexis031182  вы сами пробывали?


Цитировать
как по мне, лучше это делать через отдельный класс-менеджер
что есть класс-менеджер???
Записан
alexis031182
Гость
« Ответ #4 : Апрель 14, 2012, 16:56 »

как по мне, лучше это делать через отдельный класс-менеджер
Да, конечно. А ещё можно вообще обойтись без сохранения указателей друг на друга и решить задачу через сигнал/слоты.
Код:
MainWindow1 *w = new MainWindow1();
MainWindow2 *w2 = new MainWindow2();
connect(w, SIGNAL(my_sygnal()), w2, SLOT(my_slot()));
connect(w2, SIGNAL(my_sygnal()), w, SLOT(my_slot()));
А внутри слота my_slot() через qobject_cast<MyWindow*>(sender()) получать указатель на вызвавшего переключение окно.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #5 : Апрель 14, 2012, 16:59 »

Как только создаю в каждом из классов указатели друг на друга.....то компилятор мне выдаёт -

Цитировать
..\Temp_pro\/mainwindow2.h:15: error: ISO C++ forbids declaration of 'MainWindow1' with no type
..\Temp_pro\/mainwindow2.h:15: error: expected ';' before '*' token

alexis031182  вы сами пробывали?


Цитировать
как по мне, лучше это делать через отдельный класс-менеджер
что есть класс-менеджер???
1. допиши в заголовочных файлах соответственно class MainWindow1 и class MainWindow2
2. отдельный класс (возможно наследник QObject), который будет показывать и скрывать нужное окно
Записан

Изучением 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
alexis031182
Гость
« Ответ #6 : Апрель 14, 2012, 17:03 »

alexis031182  вы сами пробывали?
Улыбающийся не надо просто копипастить. Попробуйте разобраться.

Указанная ошибка говорит о том, что Вы не добавили объявления классов друг на друга в их заголовки.
Записан
Racot
Гость
« Ответ #7 : Апрель 14, 2012, 17:04 »

Цитировать
1. допиши в заголовочных файлах соответственно class MainWindow1 и class MainWindow2

в том то и беда что заголовочные файлы добавлены(((((((
Записан
Racot
Гость
« Ответ #8 : Апрель 14, 2012, 17:07 »

mainwindow1.h

#ifndef MAINWINDOW1_H
#define MAINWINDOW1_H

#include <QMainWindow>
#include "mainwindow2.h"

namespace Ui {
    class MainWindow1;
}

class MainWindow1 : public QMainWindow
{
    Q_OBJECT

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

 /*   void get_win2(MainWindow2 *win2)
    {
      mw2= win2;
    }*/

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow1 *ui;
    MainWindow2 *mw2;
};

#endif // MAINWINDOW1_H

//////////////////////////////////////////////////////////////////////////////////////////////////////////

mainwindow2.h

#ifndef MAINWINDOW2_H
#define MAINWINDOW2_H

#include <QMainWindow>
#include "mainwindow1.h"

namespace Ui {
    class MainWindow2;
}

class MainWindow2 : public QMainWindow
{
    Q_OBJECT



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

private:
    Ui::MainWindow2 *ui;
    MainWindow1 *mw1;
};

#endif // MAINWINDOW2_H

ничего не копипастил.......вот выдаёт ошибку
Записан
alexis031182
Гость
« Ответ #9 : Апрель 14, 2012, 17:11 »

А зачем Вам там namespace, да плюсом ещё и указатель на самого себя?
Записан
Racot
Гость
« Ответ #10 : Апрель 14, 2012, 17:15 »

Цитировать
А зачем Вам там namespace, да плюсом ещё и указатель на самого себя?

Вы про это?

namespace Ui {
    class MainWindow1;
}

private:
    Ui::MainWindow1 *ui;

так это QtCreator сам код создаёт.дело точно не в этом.
Записан
alexis031182
Гость
« Ответ #11 : Апрель 14, 2012, 17:21 »

Вы про это?
...
Да.

так это QtCreator сам код создаёт.дело точно не в этом.
А ну понял. Я не пользуюсь этим функционалом, поэтому обратил внимание, что вроде показалось мне излишним. Ну да ладно. Так-то вроде всё верно написано. Попробуйте очистить проект и заново пересобрать.
Записан
Racot
Гость
« Ответ #12 : Апрель 14, 2012, 17:27 »

очистил.пересобрал. та же ошибка.
Записан
alexis031182
Гость
« Ответ #13 : Апрель 14, 2012, 17:29 »

В обоих файлах:
Код:
namespace Ui {
class MainWindow;
class MainWindow2;
}
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #14 : Апрель 14, 2012, 17:32 »

Код
C++ (Qt)
// mainwindow1.h
 
#ifndef MAINWINDOW1_H
#define MAINWINDOW1_H
 
#include <QMainWindow>
#include "mainwindow2.h"
 
namespace Ui {
   class MainWindow1;
}
 
class MainWindow2; // тут должен быть "противоположный" класс
 
class MainWindow1 : public QMainWindow
...
Записан

Изучением 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
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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