QWidget closeEvent (...) Не вызывается с помощью QProcess :: terminate () - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть приложение Qt (A), которое запускается как приложение в системном трее Windows.

У меня также есть другое приложение Qt (B), которое запускает / закрывает любой исполняемый файл.

Если яПопробуйте закрыть приложение (A) с его контекстным меню в системном трее, все работает как положено (процесс завершен, значок в системном трее исчезает).

Однако, если я пытаюсь закрыть приложение (A) через приложение (B), значок приложения (A) на панели задач исчезает, но его процесс продолжает выполняться в фоновом режиме.Я вынужден принудительно завершить процесс, чтобы завершить его.

Приложение (B) использует QProcess для запуска исполняемых файлов.При запросе он вызывает QProcess :: terminate (), чтобы закрыть запущенное приложение.

Нет проблем с закрытием приложений, которые на самом деле имеют окна (формы).Проблемы возникают только у этого приложения без системного окна (A).

Я переопределил QWidget :: closeEvent (...), который никогда не вызывается / не вызывается.

Как я могу получить closeEvent (...) для запуска в приложении (A)?

Документация Qt подразумевает, что closeEvent запускается по запросу закрытия окна, что может быть проблемой, так как application (A)не имеет окон.Нужно ли давать заявке (А) форму и скрывать ее?

1 Ответ

0 голосов
/ 21 сентября 2018

Оказывается, форма необходима для получения closeEvent.

[closeEvent] вызывается с данным событием, когда Qt получает запрос на закрытие окна для виджета верхнего уровня от оконная система .

Я добавил форму в приложение (A) и спрятал ее.

setStyleSheet( "background: transparent;" );
setAttribute( Qt::WA_TranslucentBackground );

Теперь, когда приложение (B) отправляет QProcess :: terminate (), запускается closeEvent, и все отключается, как и ожидалось!

Ну, почти ... Одна вещь, которую я не сделалне ожидайте, что даже со скрытым окном у него все еще была кнопка на панели задач.Чтобы удалить его, я добавил следующее в конструктор:

setWindowFlags( Qt::SubWindow ); 
show();

Qt Скрыть элемент панели задач

...