Название: Запрос логина перед запуском главного окна программы. Отправлено: 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; а в Controller'е: конструктор: Код: AuthDialog *dlg = new AuthDialog( this ) Controller::exec() Код: connect( dlg, SIGNAL(authSuccess), main, SLOT(show()) ); ну или другая подобная вариация. Название: 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; а в Controller'е: конструктор: Код: AuthDialog *dlg = new AuthDialog( this ) Controller::exec() Код: connect( dlg, SIGNAL(authSuccess), main, SLOT(show()) ); ну или другая подобная вариация. Думал я на этот счет делал такую штуку 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(); Перевожу :
Название: Re: Запрос логина перед запуском главного окна программы. Отправлено: UNION labs от Апрель 10, 2012, 15:30 JKC, а вы не думали, что в этом куске кода вы делаете? кстати да :) Название: Re: Запрос логина перед запуском главного окна программы. Отправлено: Jkc от Апрель 10, 2012, 15:37 Код: [quote author=Bepec link=topic=21579.msg150002#msg150002 date=1334060963] Перевожу :
Да спасибо всем вот так работает 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()?
Ну как-то так: Код
Название: Re: Запрос логина перед запуском главного окна программы. Отправлено: V1KT0P от Апрель 10, 2012, 19:02 Проще гораздо создать функцию, вызывающую главное окно. Этот способ (и естественно он оптимальный) уже был озвучен. Просто стали перечислять варианты, как можно решить эту задачку.Т.е. в мейне будет создаваться только диалог, который в дальнейшем либо создаст главное окно(ДА), или же просто умрёт и завершит программу(НЕТ). Или я что-то незнаю о диалогах, или вы не видите этого простого решения??? PS поправкам обрадуюсь! Человек спросил как входить в дом. Я ему ответил что можно либо через дверь, либо через окно. Ну и тут начали еще предлагать: совершить подкоп под домом, залезть на крышу и через дымоход, пролезть по канализационным трубам и т.д. Люди у него банальный случай который решается переносом нужного кода из конструктора в мэйн функцию, а вы тут какие-то черезжопные методы начинаете городить =). Название: Re: Запрос логина перед запуском главного окна программы. Отправлено: alexis031182 от Апрель 10, 2012, 19:28 Просто творческий подход ))
|