Russian Qt Forum

Qt => Общие вопросы => Тема начата: Urvin от Август 24, 2009, 10:57



Название: [РЕШЕНО] Выход из приложения
Отправлено: 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()  не возымеют никакого влияния - все также появляется окно программы.

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


Название: Re: Выход из приложения
Отправлено: BRE от Август 24, 2009, 11:02
Никак не могу завершить программу после выскакивания сообщения об ошибке.. Команды close(), this->close(), qApp->quit()  не возымеют никакого влияния - все также появляется окно программы.

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

Может проще пытаться открывать порт в функции main и если открытие невозможно, то выходить из программы не создавая главного окна.


Название: Re: Выход из приложения
Отправлено: Urvin от Август 24, 2009, 11:12
блин.. косяк...
Может, в этом блоке выставлять некую переменную bool closeMePlease в true и закрывать откуда-то еще, но при старте программы?
Появится при этом главное окно, не появится - не важно


Название: Re: Выход из приложения
Отправлено: BRE от Август 24, 2009, 11:15
Может, в этом блоке выставлять некую переменную bool closeMePlease в true и закрывать откуда-то еще, но при старте программы?
Появится при этом главное окно, не появится - не важно
Да можно и так, еще можно исключение вызвать.
Только для чего лишние телодвижения?  ;)


Название: Re: Выход из приложения
Отправлено: Urvin от Август 24, 2009, 11:19
сейчас голова работает откровенно плохо и что-то мне подсказывает, что перенести эту муть в main получится оооооой как не сразу =)

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


Название: Re: Выход из приложения
Отправлено: BRE от Август 24, 2009, 11:22
сейчас голова работает откровенно плохо и что-то мне подсказывает, что перенести эту муть в main получится оооооой как не сразу =)

куды бы вставить проверку флага на закрытие?
В main, сразу за строкой создания MainWindow.


Название: Re: Выход из приложения
Отправлено: Urvin от Август 24, 2009, 11:33
То, что надо! Безмерное и безграничное спасибо!

(http://i019.radikal.ru/0710/57/a80f96f82cd3x.jpg)


Название: Re: [РЕШЕНО] Выход из приложения
Отправлено: ритт от Август 24, 2009, 11:37
что за сорт хоть?)


Название: Re: [РЕШЕНО] Выход из приложения
Отправлено: Urvin от Август 24, 2009, 11:49
Hefeweizen


Название: Re: [РЕШЕНО] Выход из приложения
Отправлено: Alex Custov от Август 24, 2009, 15:12
Код:
exit(0);


Название: Re: Выход из приложения
Отправлено: sergeyvl12 от Август 24, 2009, 20:45
сейчас голова работает откровенно плохо и что-то мне подсказывает, что перенести эту муть в main получится оооооой как не сразу =)

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

Флаг на закрытие? Некрасиво же! :) Исключение будет правильнее имхо.


Название: Re: [РЕШЕНО] Выход из приложения
Отправлено: spectre71 от Август 24, 2009, 21:02
В конструкторе главной формы имею следующее:
...
...
Никак не могу завершить программу после выскакивания сообщения об ошибке.. Команды close(), this->close(), qApp->quit()  не возымеют никакого влияния - все также появляется окно программы.

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

exit(X), где:
int X != 0; поскольку 0 - нормальное завершение!
Соответственно, конкретное заначение X != 0 - тип ошибки в твоем приложении,  если лениво классифицировать ошибки делай exit(1)


Название: Re: [РЕШЕНО] Выход из приложения
Отправлено: ритт от Август 25, 2009, 09:45
да какая разница? - exit в конструкторе класса - ну, некошерно ведь...
на мой взгляд, такой подход применим только для тела main() или в ситуации, когда аллокатору не удалось выделить память и нужно в панике сбежать...

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


Название: Re: [РЕШЕНО] Выход из приложения
Отправлено: sergeyvl12 от Август 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.


Название: Re: [РЕШЕНО] Выход из приложения
Отправлено: BRE от Август 25, 2009, 10:27
Абсолютно согласен. Для лабораторки это приемлемо. Но для большого серьезного приложения это недопустимо. С флагом тоже некрасиво.
А тебя только момент с флагом насторожил (для большого серьезного проекта)?  ;)
А то что весь функционал работы с устройством находиться в классе MainWindow - это как?  ::)


Название: Re: [РЕШЕНО] Выход из приложения
Отправлено: SASA от Август 25, 2009, 11:54
Я бы сделал конструктор отдельно, инициализация данных отдельно. Причём функция инициализации возвращает код. По этому коду либо идём дальше, либо ругаемся и выходим. Есть ещё плюс такого подхода. Иницализацию можно упечь в отдельный поток.

Цитировать
Да можно и так, еще можно исключение вызвать.

Троли не рекомендуют использовать исключения.
http://qt.gitorious.org/qt/pages/CodingConventions (http://qt.gitorious.org/qt/pages/CodingConventions)


Название: Re: [РЕШЕНО] Выход из приложения
Отправлено: sergeyvl12 от Август 25, 2009, 12:43
Абсолютно согласен. Для лабораторки это приемлемо. Но для большого серьезного приложения это недопустимо. С флагом тоже некрасиво.
А тебя только момент с флагом насторожил (для большого серьезного проекта)?  ;)
А то что весь функционал работы с устройством находиться в классе MainWindow - это как?  ::)

Вы правы. Но все потому, что я пытался отвечать В ТЕМУ. А тема у нас - ВЫХОД ИЗ ПРИЛОЖЕНИЯ. Давайте и следовать этой теме :)


Название: Re: [РЕШЕНО] Выход из приложения
Отправлено: sergeyvl12 от Август 25, 2009, 12:49
Цитировать
Троли не рекомендуют использовать исключения.
http://qt.gitorious.org/qt/pages/CodingConventions (http://qt.gitorious.org/qt/pages/CodingConventions)

Спасибо, SASA, не знал что у них есть такая рекомендация.

Это очень странно, потому что исключения - краеугольный камень плюсов (также есть во многих современных языках ).
Думаю все же исключения использовать можно и нужно, но только очень грамотно и осторожно. Но совсем отказываться... Я лучше от QT откажусь :) Даже в wxWidgets их уже разрешили использовать

[дописал позже]
Я кажется понял. Это рекомендация к разработке САМОЙ БИБЛИОТЕКИ и ее компанентов, а не приложений которые ее используют. Ну как разрабатывать библиотеку (с исключениями или без, с ртти или без ) - это их дело :) Меня же волнует чтобы я сам мог использовать исключения в моей программе.


Название: Re: [РЕШЕНО] Выход из приложения
Отправлено: BRE от Август 25, 2009, 13:01
Вы правы. Но все потому, что я пытался отвечать В ТЕМУ. А тема у нас - ВЫХОД ИЗ ПРИЛОЖЕНИЯ. Давайте и следовать этой теме :)
Так если бы было спроектировано по другому, исключения вообще бы не понадобились, о чем я сразу и написал. В main попробовали открыть устройство, не получилось - написали сообщение и вышли, получилось - создали главное окно и запустились.
 ;)