Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Jkc от Апрель 10, 2012, 14:38



Название: Запрос логина перед запуском главного окна программы.
Отправлено: Jkc от Апрель 10, 2012, 14:38
Суть вопроса как мне казалось проста,
Нужно при старте программы показать диалоговое окна с полями логин: пароль.
Если авторизяция прошла успешно появляется главное окно если нет то нечего не происходит пока
пользователь не пройдет авторизацию или не нажмет отмена, после чего программа закрывается..

я пытался сделать так


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

.....
...
     DialogAuth auth; 
     auth.setModal(true);
     auth.exec();
(  тут в auth  делам авторизацию  , там проверку и т.п. )
дальше думал сделать тут проверку

if  ( ! auth.stateLogin()  )
{
  close();  //  закрыть окно
}
   
но оно главное окно все равно открывается


Название: Re: Запрос логина перед запуском главного окна программы.
Отправлено: V1KT0P от Апрель 10, 2012, 14:41
Суть вопроса как мне казалось проста,
Нужно при старте программы показать диалоговое окна с полями логин: пароль.
Если авторизяция прошла успешно появляется главное окно если нет то нечего не происходит пока
пользователь не пройдет авторизацию или не нажмет отмена, после чего программа закрывается..

я пытался сделать так


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

.....
...
     DialogAuth auth; 
     auth.setModal(true);
     auth.exec();
(  тут в auth  делам авторизацию  , там проверку и т.п. )
дальше думал сделать тут проверку

if  ( ! auth.stateLogin()  )
{
  close();  //  закрыть окно
}
   
но оно главное окно все равно открывается
Тут есть два способа:
1) Вызывать диалог перед созданием формы, и если не пройдена авторизация, то не создавать форму.
2) Если все-же надо в конструкторе вызывать диалог, то создай публичную переменную bool m_isAuth. И если она равна false то в main не вызывать отображения окна, а сразу return 0;


Название: Re: Запрос логина перед запуском главного окна программы.
Отправлено: UNION labs от Апрель 10, 2012, 14:57
Есть еще вариант использовать третий класс, который будет в нужную минуту создавать необходимое окно

В main.cpp будет что-то вроде:
Код:
Controller c;
c.exec();

а в Controller'е:

конструктор:
Код:
AuthDialog *dlg = new AuthDialog( this )
MainWindow *main = new MainWindow( this )

Controller::exec()
Код:
connect( dlg, SIGNAL(authSuccess), main, SLOT(show()) );
dlg->exec();

ну или другая подобная вариация.


Название: Re: Запрос логина перед запуском главного окна программы.
Отправлено: alexis031182 от Апрель 10, 2012, 15:04
Можно ещё использовать State Machine Framework (https://qt-project.org/doc/qt-4.8/statemachine-api.html). Он конечно для всяческих мастеров больше подходит, но и в данном случае возможен к использованию.


Название: Re: Запрос логина перед запуском главного окна программы.
Отправлено: Bepec от Апрель 10, 2012, 15:15
Проще гораздо создать функцию, вызывающую главное окно.

Т.е. в мейне будет создаваться только диалог, который в дальнейшем либо создаст главное окно(ДА), или же просто умрёт и завершит программу(НЕТ).

Или я что-то незнаю о диалогах, или вы не видите этого простого решения???

PS поправкам обрадуюсь!


Название: Re: Запрос логина перед запуском главного окна программы.
Отправлено: alexis031182 от Апрель 10, 2012, 15:19
Проще гораздо создать функцию, вызывающую главное окно.

Т.е. в мейне будет создаваться только диалог, который в дальнейшем либо создаст главное окно(ДА), или же просто умрёт и завершит программу(НЕТ).

Или я что-то незнаю о диалогах, или вы не видите этого простого решения???

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


Название: Re: Запрос логина перед запуском главного окна программы.
Отправлено: Jkc от Апрель 10, 2012, 15:20
Есть еще вариант использовать третий класс, который будет в нужную минуту создавать необходимое окно

В main.cpp будет что-то вроде:
Код:
Controller c;
c.exec();

а в Controller'е:

конструктор:
Код:
AuthDialog *dlg = new AuthDialog( this )
MainWindow *main = new MainWindow( this )

Controller::exec()
Код:
connect( dlg, SIGNAL(authSuccess), main, SLOT(show()) );
dlg->exec();

ну или другая подобная вариация.

Думал  я на этот счет делал такую штуку

    Dialog *w = new Dialog();

    DialogAuth * auth = new DialogAuth();
    auth->exec();
    QObject::connect( auth, SIGNAL(emitComplited()),
                      w, SLOT( exec()) );

и вариации на эту же тему, но результата нет.
Просто не приходит сигнал emitComplited()


Название: Re: Запрос логина перед запуском главного окна программы.
Отправлено: UNION labs от Апрель 10, 2012, 15:24
а в DialogAuth покажите код метода который испускает сигнал emitComplited()?


Название: Re: Запрос логина перед запуском главного окна программы.
Отправлено: RealDuke от Апрель 10, 2012, 15:25
Просто не приходит сигнал emitComplited()
Значит ты его не посылаешь


Название: Re: Запрос логина перед запуском главного окна программы.
Отправлено: Bepec от Апрель 10, 2012, 15:29
JKC, а вы не думали, что в этом куске кода вы делаете?
Код:
   DialogAuth * auth = new DialogAuth();
    auth->exec();
    QObject::connect( auth, SIGNAL(emitComplited()),
                      w, SLOT( exec()) );

Перевожу :
  • Создаёте auth
  • Запускаете цикл обработки событий
  • Цикл завершается когда пользователь убивает диалог любым способом.
  • И вот тут вы цепляете к мёртвому диалогу сигнал. О_о . Он же мёртв в этот момент получается овродя.


Название: Re: Запрос логина перед запуском главного окна программы.
Отправлено: UNION labs от Апрель 10, 2012, 15:30
JKC, а вы не думали, что в этом куске кода вы делаете?

кстати да :)


Название: Re: Запрос логина перед запуском главного окна программы.
Отправлено: Jkc от Апрель 10, 2012, 15:37
Код:
[quote author=Bepec link=topic=21579.msg150002#msg150002 date=1334060963]
JKC, а вы не думали, что в этом куске кода вы делаете?
[code]
   DialogAuth * auth = new DialogAuth();
    auth->exec();
    QObject::connect( auth, SIGNAL(emitComplited()),
                      w, SLOT( exec()) );

Перевожу :
  • Создаёте auth
  • Запускаете цикл обработки событий
  • Цикл завершается когда пользователь убивает диалог любым способом.
  • И вот тут вы цепляете к мёртвому диалогу сигнал. О_о . Он же мёртв в этот момент получается овродя.
[/quote]
Да спасибо всем вот так работает
   DialogAuth * auth = new DialogAuth();

    QObject::connect( auth, SIGNAL(emitComplited()),
                      w, SLOT( exec()) );[/code]

    auth->exec();


Название: Re: Запрос логина перед запуском главного окна программы.
Отправлено: Bepec от Апрель 10, 2012, 15:40
;) всегда рад помочь, показать гадкую ошибку и мезко похихикать ;) Обращайтесь.


Название: Re: Запрос логина перед запуском главного окна программы.
Отправлено: iroln от Апрель 10, 2012, 16:08
А зачем нужен сигнал, если можно использовать DialogCode, который возвращается методом exec()?

Ну как-то так:
Код
C++ (Qt)
if (auth->exec() == QDialog::Accepted) {
   // Продолжаем работу
}
 


Название: Re: Запрос логина перед запуском главного окна программы.
Отправлено: V1KT0P от Апрель 10, 2012, 19:02
Проще гораздо создать функцию, вызывающую главное окно.

Т.е. в мейне будет создаваться только диалог, который в дальнейшем либо создаст главное окно(ДА), или же просто умрёт и завершит программу(НЕТ).

Или я что-то незнаю о диалогах, или вы не видите этого простого решения???

PS поправкам обрадуюсь!
Этот способ (и естественно он оптимальный) уже был озвучен. Просто стали перечислять варианты, как можно решить эту задачку.
Аналогия:
Человек спросил как входить в дом. Я ему ответил что можно либо через дверь, либо через окно. Ну и тут начали еще предлагать: совершить подкоп под домом, залезть на крышу и через дымоход, пролезть по канализационным трубам и т.д.
Люди у него банальный случай который решается переносом нужного кода из конструктора в мэйн функцию, а вы тут какие-то черезжопные методы начинаете городить =).


Название: Re: Запрос логина перед запуском главного окна программы.
Отправлено: alexis031182 от Апрель 10, 2012, 19:28
Просто творческий подход ))