Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2012, 21:10   #1
_KUL
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 96
По умолчанию qt взаимодействие между формами диалогов

есть форма, на ней есть кнопка, хочу нажать кнопку и чтобы показалась вторая форма, а первая закрылась.
сделал 2 класса, в первом классе один наследник кудиалог + интерфейс ui, во втором классе второй наследник кудиалог + интерфейс. есть 2 объекта этих классов, получается при сигнале нажатия кнопки в первом классе, должен вызваться слот, который должен отобразить интерфейс второго класса ob.show();. Но проблема в том, что я не знаю как мне в функции сигнала первого объекта вызвать метод второго объекта.

PHP код:
[B]main.cpp[/B]

#include <QApplication>
#include "dialog.h"
#include "generalpanel.h"

int main(int argcchar *argv[])
{
    
QApplication a(argcargv);
    
Dialog w;
    
w.show();

    
generalpanel  gp;

    return 
a.exec();

первый класс
PHP код:
[B]dialog.h[/B]

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

namespace Ui {
class 
Dialog;
}

class 
Dialog : public QDialog
{
    
Q_OBJECT
    
public:
    
explicit Dialog(QWidget *parent 0);
    ~
Dialog();
    
private:
    
Ui::Dialog *ui;

public 
slots:
    
void auth();
};

#endif // DIALOG_H 
PHP код:
[B]dialog.cpp[/B]

#include "dialog.h"
#include "ui_dialog.h"

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

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

void Dialog::auth()
{
    
//как мне тут сказать gp.show(); ???
    //можно в auth передать ссылку, например &ob, но тогда как в 
ui->pushButton->clicked(); мне сказатьчтобы он подставил gp
чтобы я потом сделал ob.show();???

второй класс
PHP код:
[B]generalpanel.h[/B]

#ifndef GENERALPANEL_H
#define GENERALPANEL_H

#include <QDialog>

namespace Ui {
class 
generalpanel;
}

class 
generalpanel : public QDialog
{
    
Q_OBJECT

public:
    
explicit generalpanel(QWidget *parent 0);
    ~
generalpanel();

private:
    
Ui::generalpanel *ui;
};
#endif // GENERALPANEL_H 
PHP код:
[B]generalpanel.cpp[/B]

#include "generalpanel.h"
#include "ui_generalpanel.h"

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

generalpanel::~generalpanel()
{
    
delete ui;

При попытке в main.cpp сделать переменные глобальными
PHP код:
#include <QApplication>
#include "dialog.h"
#include "generalpanel.h"

Dialog w;
generalpanel  gp;

int main(int argcchar *argv[])
{
    
QApplication a(argcargv);

    
w.show();

    return 
a.exec();

программа падает с ошибкой в qglobal.cpp ...

По сути задача тривиальная как мир, показывается форма для ввода логина/пароля, и при нажатии кнопки проверяются данные и потом открывается вторая форма и скрывается первая. А не понимаю как сделать ...

Последний раз редактировалось _KUL; 21.05.2012 в 21:12.
_KUL вне форума Ответить с цитированием
Старый 22.05.2012, 20:02   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2_KUL
способов мильен.
вот один из них.
Код:
#include <QtGui/QApplication>
#include "dialog.h"
#include "mainwindow.h"

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

    Dialog dlg;
    dlg.show();

    if (dlg.exec() != QDialog::Accepted)
        return 0;

    MainWindow w;
    w.show();

    return a.exec();
}
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 22.05.2012, 20:15   #3
_KUL
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 96
По умолчанию

хм ... у вас тут явно определено.
а как функция класса 1 будет знать имя объекта класса 2 ? ведь слот 1 класса ограничен областью видимости функции-слота + паблик элементов данного класса, т.е. он не может обращаться к main.cpp чтобы спросить, есть ли там такой объект
_KUL вне форума Ответить с цитированием
Старый 22.05.2012, 22:43   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2_KUL
зачем диалогу что то знать о окне? диалог может только вернуть результат, accepted или rejected. на основании этих данных мы либо создаем, либо не создаем наше окно
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 23.05.2012, 10:37   #5
_KUL
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 96
По умолчанию

а можете немного по подробнее описать пример?
_KUL вне форума Ответить с цитированием
Старый 23.05.2012, 13:32   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2_KUL
ну тут такой тривиальный код, что рассматривать подробнее нечего.

создаешь диалог. проверяешь, что он вернул. если нажали ok - должен вернуть accepted. нажали cancel - должен вернуть rejected (это поведение ты сам должен в своем диалоге задать, привязав сигналы clicked() кнопок ok и cancel к слотам диалога accept() и reject()). дальше в main проверяешь, что диалог вернул. вернул accepted, значит пользователь нажал ok, покажем основное окно. вернул rejected - пользователь нажал cancel, можно показать какое нить другое окно, или просто выйти из программы, как в моем примере.

и диалог ничего не должен знать о каком то окне. он просто создается, показывается и возвращает результат своей работы. вопрос о создании или несоздании окна решается на более верхнем уровне (у меня - в функции main), а не внутри слота клика кнопки диалога

ПС. может, так понятнее? хотя код тот же самый
Код:
#include <QtGui/QApplication>
#include "dialog.h"
#include "mainwindow.h"

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

	Dialog dlg;
	dlg.show();

	// если нажали ok - покажем окно
	if (dlg.exec() == QDialog::Accepted) {
		MainWindow w;
		w.show();
		return a.exec();
	}

	// нажали отмену, просто выйдем из программы
	return 0;
}
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 23.05.2012 в 13:35.
pproger вне форума Ответить с цитированием
Старый 23.05.2012, 16:22   #7
_KUL
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 96
По умолчанию

Спасибо, вроде понял, НО, опять возник ряд вопросов ...
получается мы accepted true сообщаем, что виджет отработал и теперь закрывается с параметром accepted = true ?! А если не нужно чтобы он закрывался, повторно предыдущему виджету делать show ?

А если мне нужно в зависимости от кнопки, выводить разные окна?
К примеру, я сделал так - объявил в классе переменную, которая хранит int, теперь смотрю, если был accepted == true и в переменной 1, то выводим окно 2, а если в переменной было 2, то окно 3. Но почему то при нажатии на кнопку 1 выводится нормально окно 2, а при нажатии на кнопку 2, не выводится окно 3, но если второй раз нажать на кнопку 2, то выводится окно 3. Почему так?

dialog.h
PHP код:
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <generalpanel.h>

namespace Ui {
class 
Dialog;
}

class 
Dialog : public QDialog
{
    
Q_OBJECT

public:
    
Dialog(QWidget *parent 0);
    ~
Dialog();
    
Ui::Dialog *ui;
    
int m//хранит состояние по которому смотрим, куда переходить

    
private:
    
//Ui::Dialog *ui;

public slots:
    
void auth();
    
void auth2();
};

#endif // DIALOG_H 
dialog.cpp
PHP код:
#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    
QDialog(parent),
    
ui(new Ui::Dialog)
{
    
ui->setupUi(this);
//нажали на кнопку 1
    
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(auth()));
//нажали на кнопку 2
    
connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(auth2()));
    
this->0;

}

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

//событие кнопки 1
void Dialog::auth()
{
    
1;
    
this->ui->label->setText("form 2");
    
this->accept();
}

//событие кнопки 2
void Dialog::auth2()
{
    
2;
//при первом нажатии, на форме w ставится эта надпись, но форма не 
//закрывается и не открывается вторая форма gp! При последующем 
//нажатии, форма w закрывается и открывается gp. Почему так происходит?
    
this->ui->label->setText("form 3");
//почему ассепт со второго нажатия на кнопку только выполняется?
    
this->accept();

generalpanel.h
PHP код:
#ifndef GENERALPANEL_H
#define GENERALPANEL_H

#include <QDialog>

namespace Ui {
class 
generalpanel;
}

class 
generalpanel : public QDialog
{
    
Q_OBJECT

public:
    
explicit generalpanel(QWidget *parent 0);
    ~
generalpanel();
    
Ui::generalpanel *ui;

private:
    
//Ui::generalpanel *ui;
};
#endif // GENERALPANEL_H 
generalpanel.cpp
PHP код:
#include "generalpanel.h"
#include "ui_generalpanel.h"

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

generalpanel::~generalpanel()
{
    
delete ui;

main.cpp
PHP код:
#include <QApplication>
#include "dialog.h"
#include "generalpanel.h"
#include "ui_generalpanel.h"

int main(int argcchar *argv[])
{
    
QApplication a(argcargv);

    
Dialog w;
    
w.show();

//если ассепт и m равна 1, то вроде как делается это
    
if ((w.exec() == QDialog::Accepted) & (w.== 1)) {
        
generalpanel gp;
        
gp.show();
        
gp.ui->label->setText("form 2");
        return 
a.exec();
    }
//если ассепт и m равна 2, то вроде как должно это, но не делается
    
else if ((w.exec() == QDialog::Accepted) & (w.== 2)) {
        
generalpanel gp2;
        
gp2.show();
        
gp2.ui->label->setText("form 3");
        return 
a.exec();
    }

    return 
0;


_KUL вне форума Ответить с цитированием
Старый 23.05.2012, 16:36   #8
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2_KUL
слишком сумбурно, читать тяжело. хочешь - звони в скайп часов в 9 по москве, объясню в тимвьювере
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 23.05.2012, 16:39   #9
_KUL
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 96
По умолчанию

получается при конструкции
if ((w.exec() == QDialog::Accepted) {

return a.exec();
}
программа ждёт accepted == true и продолжит выполнение, только после его получения?! м при этом она ждёт его в первом вхождении if, несмотря на второй указатель равный 1, даже если он равен 2м ?! Когда мы нажимаем кнопку 2, первое условие становится ложным, т.к. указатель должен быть равным 1, а он равен 2м, поэтому он ждёт второй раз результата w.exec() во втором условии, как раз когда я второй раз нажимаю, условие становится истинным и выводится форма 3 ?!
Такс ... а как сделать, чтобы ветвление это нормально работало?
_KUL вне форума Ответить с цитированием
Старый 23.05.2012, 16:40   #10
_KUL
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 96
По умолчанию

pproger, в Хабаровске уже 4 часа ночи будет ... да и мика нет ...
_KUL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как наладить взаимодействие между формами программы mixmon Visual C++ 6 26.06.2015 12:11
Взаимодействие между формами и БД Lazio Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 2 28.01.2012 10:39
Взаимодействие между формами в dll RUSlan48 Общие вопросы Delphi 2 01.03.2011 22:40
организовать взаимодействие между формами, как? lexluter1988 Общие вопросы .NET 1 21.05.2010 06:49
Взаимодействие между формами Marsel737 Общие вопросы Delphi 5 16.11.2009 22:29