LINUX.ORG.RU

[c++ qt] Вызов основного окна из диалогового окна


0

1

Приветствую. Я пишу программу, которая работает с БД. В программе сначала появляется диалоговое окно, в котором запрашиваются авторизационные данные (логин, пароль, база). Я хочу, чтобы после этого появлялось основное окно. Общая структура программы такова:

1) класс AuthDialog (authdialog.cpp) - диалоговое окно авторизации;

2) класс ClientWindow (clientwindow.cpp)- основное окно;

3) main.cpp - запускалка.

Мой ход действий таков:

1) делаю connect между кнопкой loginButton и методом AuthDialog::connectDb, где connectDb - метод, производящий подключение к БД;

2) в методе AuthDialog::connectDb я хочу сделать нечто вроде w.show(), где w - инстанс класса ClientWindow.

Вся проблема заключается в том, что я не знаю, как вызвать w.show(), если w продекларирован в main и доступа из класса AuthDialog у меня к нему нет. Подскажите, пожалуйста, как это можно сделать.

Ну, сделай shared_ptr какой-нибудь глобальный, на инстанс ClientWindow, которому из майна делается шов.

Но вообще, если ты задаешь главное окно как родительский виджет для диалога, то ты имея окно диалога можешь получить указатель на его родительский виджет через метод QWidget * QWidget::parentWidget () const. Предпологается, что твой диалог наследуется, таки, от QWidget.

Remington
()

Логичнее сделать будет диалог логина в классе главного окна, чтобы сначала он показывался, а потом окно.

flareguner
()

>Вся проблема заключается в том, что я не знаю, как вызвать w.show(), если w продекларирован в main и доступа из класса AuthDialog у меня к нему нет.

вытащи руки из ж^W^W^W w из main(), очевидно же

annulen ★★★★★
()
Ответ на: комментарий от flareguner

>Логичнее сделать будет диалог логина в классе главного окна

или в потомке QApplication

annulen ★★★★★
()

Может просто передать указатель на ClientWindow?

Там где создаешь экземпляр AuthDialog:

emit signalSendWindow(this);

в AuthDialog.h:

ClientWindow* clientWindow
public slots:
    void slotGetWindow(ClientWindow* cw)
    {
        clientWindow = cw;
    }

или может быть просто через функцию то же самое.

hor
()
Ответ на: комментарий от hor

Ты когда окно создаёшь полюбому ему указатель на парента даёшь. Или ты хочешь, что бы экземпляр главного окна не создавался, пока пользователь не залогинится? Тогда как-то так: http://lists.trolltech.com/qt-interest/2000-07/msg00308.html

Remington
()

1. AuthDialog при успешной авторизации выдаёт сигнал, скажем emit authorized()

2. У окна ClientWindow есть слот show() (он унаследован от QWidget).

3. connect(AuthDialog, SIGNAL(authorzied()), ClientWindow, SLOT(show()))

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

+1 Единственный голос разума в темном царстве велосипедов.

anonymous
()
Ответ на: комментарий от annulen

плюсую. По мне так очевидно, что логично было бы что-то вроде этого:

AuthDialog dlg;
MainWindow w;
if (dlg.exec() == QDialog::Accepted)
{
    if (testConnect())
    {
        w.show();
        return app.exec();
    }
    else
    {
        // WRONG AUTH DATA
    }
}
else
{
return 0;
}

irq
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.