Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: xintrea от Октябрь 21, 2014, 01:51



Название: Qt не знает события выхода из системы (пруф видео). Как корректно закрыть прогу?
Отправлено: xintrea от Октябрь 21, 2014, 01:51

В моем проекте MyTetra (http://webhamster.ru/site/page/index/articles/projectcode/105) есть застарелый баг: иногда невозможен выход из системы (KDE4), если работает MyTetra. При этом выводится сообщение что MyTetra заблокировала выход из системы. Для выхода приходится вручную закрыть программу MyTetra, после чего можно выйти.

Это могло бы происходить из-за открытых файлов. Но в MyTetra специально сделано так, что все файлы всегда держатся закрытыми. Открываются на запись только при изменении и снова закрываются. Однако в MyTetra используется QtSingleApplication, и сдается мне, что именно эта обертка держит открытыми какие-то свои файлы, и из-за нее нельзя иногда выйти из системы (закономерность до сих пор не ясна, strace показывает только на файлы в /tmp, создаваемые не моим кодом).

Самый очевидный путь решения проблемы - выходить из MyTetra при обнаружении выхода из Иксов или выхода из DE. Однако, я не могу отследить это событие. Такое впечатление, что его просто нет. Я делаю логирование всех событий (отладочный вывод в eventFilter() главного окна). И при действиях с панелью (нажатие на кнопку K-меню), и даже при выходе из KDE4, в MyTetra никаких событий не прилетает.

Видео (10 Мб): http://rghost.ru/58633355

Вопрос: как обнаружить выход из DE или из Иксов, чтобы корректно завершить приложение?


Название: Re: Qt не знает события выхода из системы (пруф видео). Как корректно закрыть прогу?
Отправлено: Alex Custov от Октябрь 21, 2014, 02:05
http://qt-project.org/doc/qt-5/session.html ?


Название: Re: Qt не знает события выхода из системы (пруф видео). Как корректно закрыть прогу?
Отправлено: vulko от Октябрь 23, 2014, 15:29
Попробуй сигнал.

Код:
void QCoreApplication::aboutToQuit() [signal]

Цитировать
This signal is emitted when the application is about to quit the main event loop, e.g. when the event loop level drops to zero. This may happen either after a call to quit() from inside the application or when the users shuts down the entire desktop session. The signal is particularly useful if your application has to do some last-second cleanup. Note that no user interaction is possible in this state.