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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Запрос логина перед запуском главного окна программы.  (Прочитано 10951 раз)
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();  //  закрыть окно
}
   
но оно главное окно все равно открывается
Записан
V1KT0P
Гость
« Ответ #1 : Апрель 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;
Записан
UNION labs
Гость
« Ответ #2 : Апрель 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();

ну или другая подобная вариация.
Записан
alexis031182
Гость
« Ответ #3 : Апрель 10, 2012, 15:04 »

Можно ещё использовать State Machine Framework. Он конечно для всяческих мастеров больше подходит, но и в данном случае возможен к использованию.
Записан
Bepec
Гость
« Ответ #4 : Апрель 10, 2012, 15:15 »

Проще гораздо создать функцию, вызывающую главное окно.

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

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

PS поправкам обрадуюсь!
Записан
alexis031182
Гость
« Ответ #5 : Апрель 10, 2012, 15:19 »

Проще гораздо создать функцию, вызывающую главное окно.

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

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

PS поправкам обрадуюсь!
Этот способ (и естественно он оптимальный) уже был озвучен. Просто стали перечислять варианты, как можно решить эту задачку.
Записан
Jkc
Гость
« Ответ #6 : Апрель 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()
Записан
UNION labs
Гость
« Ответ #7 : Апрель 10, 2012, 15:24 »

а в DialogAuth покажите код метода который испускает сигнал emitComplited()?
Записан
RealDuke
Гость
« Ответ #8 : Апрель 10, 2012, 15:25 »

Просто не приходит сигнал emitComplited()
Значит ты его не посылаешь
Записан
Bepec
Гость
« Ответ #9 : Апрель 10, 2012, 15:29 »

JKC, а вы не думали, что в этом куске кода вы делаете?
Код:
   DialogAuth * auth = new DialogAuth();
    auth->exec();
    QObject::connect( auth, SIGNAL(emitComplited()),
                      w, SLOT( exec()) );

Перевожу :
  • Создаёте auth
  • Запускаете цикл обработки событий
  • Цикл завершается когда пользователь убивает диалог любым способом.
  • И вот тут вы цепляете к мёртвому диалогу сигнал. О_о . Он же мёртв в этот момент получается овродя.
Записан
UNION labs
Гость
« Ответ #10 : Апрель 10, 2012, 15:30 »

JKC, а вы не думали, что в этом куске кода вы делаете?

кстати да Улыбающийся
Записан
Jkc
Гость
« Ответ #11 : Апрель 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();
Записан
Bepec
Гость
« Ответ #12 : Апрель 10, 2012, 15:40 »

Подмигивающий всегда рад помочь, показать гадкую ошибку и мезко похихикать Подмигивающий Обращайтесь.
Записан
iroln
Гость
« Ответ #13 : Апрель 10, 2012, 16:08 »

А зачем нужен сигнал, если можно использовать DialogCode, который возвращается методом exec()?

Ну как-то так:
Код
C++ (Qt)
if (auth->exec() == QDialog::Accepted) {
   // Продолжаем работу
}
 
Записан
V1KT0P
Гость
« Ответ #14 : Апрель 10, 2012, 19:02 »

Проще гораздо создать функцию, вызывающую главное окно.

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

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

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


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