Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Главная форма и диалог 
:(
    Опции темы
SABROG
Дата 29.9.2008, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Я правильно понимаю, так программа не выходит ?

Код

qApp->exit(1);



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Acer
Дата 29.9.2008, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 5.9.2007
Где: UA::DN

Репутация: 15
Всего: 8



Угу. Так не работает.
PM MAIL   Вверх
SABROG
Дата 29.9.2008, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Проблема в том, что конструктор главного окна еще не создан и все exit и quit бесполезны. Вероятно есть 3 способа решения данной проблемы в конструкторе:
  •  Использовать connect в конструкторе на слот close() главного окна с флагом Qt::QueuedConnection (не проверял, возможно работать не будет)
  •  Использовать throw; для возбуждения исключения и tr{}...catch{} в main.cpp, чтобы его корректно словить
  •  Использовать QTimer::singleShot(0, qApp, SLOT(quit())); Но тогда надо убрать w.show() из main.cpp и перенести его в другое место иначе окно будет на секунду появляться и исчезать
И еще 3 способа, которые я бы выбрал:
  •  Создать отложенный сигнал (Qt::QueuedConnection) на слот в главном окне. Сделать emit(). Когда главное окно полностью создастся будет вызвать его слот, где и будет выводится и создаваться диалог авторизации. Там уже close() будет работать.
  •  Использовать QTimer::singleShot(0, this, SLOT(AuthDialogSlot())). По логике тоже что и первый вариант
  •  Перенести код авторизации в main.cpp до создания главного окна. Xml, Sql, SSL и т.п. вполне работают без GUI. Тем более, что бизнес-логику и гуи лучше разделять.


Это сообщение отредактировал(а) SABROG - 29.9.2008, 17:51


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 29.9.2008, 17:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 7
Всего: 250



Цитата(aspirin2003 @  29.9.2008,  15:37 Найти цитируемый пост)
что в main мне также нужно перетаскивать код, отвечающий за сетевое соединение, SSL-шифрование, и парсинг XML (протокол взаимодействия на нем основан).
Это не есть гут, с моей точки зрения.

Так добавь в главную форму метод например RunAuth (), в который перенеси из конструктора то что надо для идентефикации,
а в main вначале создай форму, а потом вызови метод RunAuth (), при неудачи которого, можно будет закрыть окно как из main, так и из этого метода . )

P.S. и вобще удалять объект в своем конструкторе ("даже" если оно окно) очень некрасиво.  smile 

Это сообщение отредактировал(а) mes - 29.9.2008, 18:01


--------------------
PM MAIL WWW   Вверх
aspirin2003
Дата 30.9.2008, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



Цитата(mes @ 29.9.2008,  17:55)
Так добавь в главную форму метод например RunAuth (), в который перенеси из конструктора то что надо для идентефикации,
а в main вначале создай форму, а потом вызови метод RunAuth (), при неудачи которого, можно будет закрыть окно как из main, так и из этого метода . )

mes, вроде неплохой способ, как мне показалось, после выполнения runAuth диалог закрывается, главная форма тоже, но приложение остается незавершенным и висит в памяти
Код

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

    ClientMainWindow w(a.instance());
    w.runAuth();
    return a.exec();
}

Код

void ClientMainWindow::runAuth()
{
    AuthForm authDlg(this);
    bool loggedIn = false;
    // Показываем диалог аутентификации, пока пользователь не залогинится,
    // либо не будет нажата отмена
    while (!loggedIn && authDlg.exec() == QDialog::Accepted)
    {
           // здесь будет код
    }
    if (!loggedIn)
    {
        //close();
        //main_app->quit();
        main_app->exit(1);
    }
}


Это сообщение отредактировал(а) aspirin2003 - 30.9.2008, 11:23
PM MAIL   Вверх
mes
Дата 30.9.2008, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 7
Всего: 250



Цитата(aspirin2003 @  30.9.2008,  11:22 Найти цитируемый пост)
но приложение остается незавершенным и висит в памяти

ну а это что такое?

Цитата(aspirin2003 @  30.9.2008,  11:22 Найти цитируемый пост)
   w.runAuth();
    return a.exec();


Цитата

int QApplication::exec ()
Enters the main event loop and waits until exit() is called or the main widget is destroyed, and returns the value that was set to exit() (which is 0 if exit() is called via quit()).

Вы опять столкнулись с проблемой, когда "удалять" хотите раньше, чем запустили ).
Самый простой способ решить это, "заставить" возвращать метод runAuth() результат. В итоге получится:
Код

    ClientMainWindow w(); 
    return   w.runAuth() ? a.exec() : 0;




--------------------
PM MAIL WWW   Вверх
Acer
Дата 1.10.2008, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 5.9.2007
Где: UA::DN

Репутация: 15
Всего: 8



А что, если попробовать сделать через
сигнал QApplication - lastWindowClosed() ? Вдруг получится
PM MAIL   Вверх
mes
Дата 1.10.2008, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 7
Всего: 250



Цитата(Acer @  1.10.2008,  14:39 Найти цитируемый пост)
А что, если попробовать сделать через
сигнал QApplication - lastWindowClosed() ? Вдруг получится 

Цитата(mes @  30.9.2008,  14:10 Найти цитируемый пост)
Вы опять столкнулись с проблемой, когда "удалять" хотите раньше, чем запустили ).

так сигнал придет раньше чем выполнится строчка a.exec();
чтоб использовать систему сигналов для вышеупомянутой цели, надо отнаследоваться от QApplication  и в нем реализовать нужные действия

Это сообщение отредактировал(а) mes - 1.10.2008, 14:50


--------------------
PM MAIL WWW   Вверх
aspirin2003
Дата 1.10.2008, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



Всем спасибо за ответы
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0492 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.