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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Выход из приложения  (Прочитано 12567 раз)
Urvin
Гость
« : Август 24, 2009, 10:57 »

В конструкторе главной формы имею следующее:
Код
C++ (Qt)
MainWindow::MainWindow(QWidget *parent)
   : QMainWindow(parent), ui(new Ui::MainWindow)
{
   ui->setupUi(this);
 
   //...
   //...
 
   if (!openPort()) // собственная функция
   {
       QMessageBox::critical(this,"Port error.","Application will be terminated",QMessageBox::Ok);
 
       // Здесь должен быть выход из программы
 
   }
}

Никак не могу завершить программу после выскакивания сообщения об ошибке.. Команды close(), this->close(), qApp->quit()  не возымеют никакого влияния - все также появляется окно программы.

Где я неправ и как все же завершить работу программы?  Непонимающий
« Последнее редактирование: Август 24, 2009, 11:34 от Urvin » Записан
BRE
Гость
« Ответ #1 : Август 24, 2009, 11:02 »

Никак не могу завершить программу после выскакивания сообщения об ошибке.. Команды close(), this->close(), qApp->quit()  не возымеют никакого влияния - все также появляется окно программы.

Где я неправ и как все же завершить работу программы?  Непонимающий
Когда отрабатывает конструктор MainWindow цикл обработки событий еще не запущен и окно еще не открыто. Поэтому ни close ни quit, эффекта не дают.

Может проще пытаться открывать порт в функции main и если открытие невозможно, то выходить из программы не создавая главного окна.
Записан
Urvin
Гость
« Ответ #2 : Август 24, 2009, 11:12 »

блин.. косяк...
Может, в этом блоке выставлять некую переменную bool closeMePlease в true и закрывать откуда-то еще, но при старте программы?
Появится при этом главное окно, не появится - не важно
Записан
BRE
Гость
« Ответ #3 : Август 24, 2009, 11:15 »

Может, в этом блоке выставлять некую переменную bool closeMePlease в true и закрывать откуда-то еще, но при старте программы?
Появится при этом главное окно, не появится - не важно
Да можно и так, еще можно исключение вызвать.
Только для чего лишние телодвижения?  Подмигивающий
Записан
Urvin
Гость
« Ответ #4 : Август 24, 2009, 11:19 »

сейчас голова работает откровенно плохо и что-то мне подсказывает, что перенести эту муть в main получится оооооой как не сразу =)

куды бы вставить проверку флага на закрытие?
Записан
BRE
Гость
« Ответ #5 : Август 24, 2009, 11:22 »

сейчас голова работает откровенно плохо и что-то мне подсказывает, что перенести эту муть в main получится оооооой как не сразу =)

куды бы вставить проверку флага на закрытие?
В main, сразу за строкой создания MainWindow.
Записан
Urvin
Гость
« Ответ #6 : Август 24, 2009, 11:33 »

То, что надо! Безмерное и безграничное спасибо!

Записан
ритт
Гость
« Ответ #7 : Август 24, 2009, 11:37 »

что за сорт хоть?)
Записан
Urvin
Гость
« Ответ #8 : Август 24, 2009, 11:49 »

Hefeweizen
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #9 : Август 24, 2009, 15:12 »

Код:
exit(0);
Записан
sergeyvl12
Гость
« Ответ #10 : Август 24, 2009, 20:45 »

сейчас голова работает откровенно плохо и что-то мне подсказывает, что перенести эту муть в main получится оооооой как не сразу =)

куды бы вставить проверку флага на закрытие?

Флаг на закрытие? Некрасиво же! Улыбающийся Исключение будет правильнее имхо.
Записан
spectre71
Гость
« Ответ #11 : Август 24, 2009, 21:02 »

В конструкторе главной формы имею следующее:
...
...
Никак не могу завершить программу после выскакивания сообщения об ошибке.. Команды close(), this->close(), qApp->quit()  не возымеют никакого влияния - все также появляется окно программы.

Где я неправ и как все же завершить работу программы?  Непонимающий

exit(X), где:
int X != 0; поскольку 0 - нормальное завершение!
Соответственно, конкретное заначение X != 0 - тип ошибки в твоем приложении,  если лениво классифицировать ошибки делай exit(1)
Записан
ритт
Гость
« Ответ #12 : Август 25, 2009, 09:45 »

да какая разница? - exit в конструкторе класса - ну, некошерно ведь...
на мой взгляд, такой подход применим только для тела main() или в ситуации, когда аллокатору не удалось выделить память и нужно в панике сбежать...

из всех моих проектов на кутэ только в одном используется exit(X) - в дебаге при выбросе qCriticalType сообщения...
Записан
sergeyvl12
Гость
« Ответ #13 : Август 25, 2009, 10:07 »

да какая разница? - exit в конструкторе класса - ну, некошерно ведь...
на мой взгляд, такой подход применим только для тела main() или в ситуации, когда аллокатору не удалось выделить память и нужно в панике сбежать...

из всех моих проектов на кутэ только в одном используется exit(X) - в дебаге при выбросе qCriticalType сообщения...

Абсолютно согласен. Для лабораторки это приемлемо. Но для большого серьезного приложения это недопустимо. С флагом тоже некрасиво.

лучше всего так:

Код:
int main()
{

MyWindow window = NULL;
try // Initialization
{
....
    window = new MyWindow(...);
....

}
catch( const MyException& e )
{
    MessageBox(e.what());
    return 1;
}
catch(std::exception e)
{
    MessageBox(e.what());
    return 2;
}
catch(...)
{
    MessageBox("Unknown exception");
    return 3;
}

...
// Main loop
...

return 0;

}


Заодно в этом же месте перехватим и ошибки выделения памяти и длугие ошибки.

Теперь из конструктора нужно вызвать throw(MyException("text")); и все...

P.S. Вместо exit() в main() можно использовать return.
Записан
BRE
Гость
« Ответ #14 : Август 25, 2009, 10:27 »

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


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