В моем приложении мне нужно дождаться завершения внешней программы (с использованием QProcess
). Я хочу, чтобы приложение было ответственным, поэтому методы блокировки неприемлемы.QApplication :: processEvents никогда не возвращает
Также мне нужно запретить ввод пользователя. Я пытался сделать QEventLoop
и EXEC его с QEventLoop::ExcludeUserInputEvents
флагом, но, как говорит документация она только задерживает обработку событий:
события не отбрасываются; они будут доставлены в следующий раз, когда
processEvents()
вызывается без флагаExcludeUserInputEvents
.
Так я реализовал простой фильтр событий и установить его на qApp
(идея взял из Qt Application: Simulating modal behaviour (enable/disable user input)). Он работает хорошо, но иногда функция QApplication::processEvents
никогда не возвращается, даже если я укажу максимальное время ожидания. Может ли кто-нибудь помочь мне понять по каким причинам это происходит периодически??
class UserInputEater : public QObject
{
public:
bool eventFilter(QObject *object, QEvent *event)
{
switch(event->type())
{
case QEvent::UpdateRequest:
case QEvent::UpdateLater:
case QEvent::Paint:
return QObject::eventFilter(object, event);
default:
return true;
}
}
};
-
UserInputEater eventEater;
qApp->installEventFilter(&eventEater);
QProcess prc;
prc.start("...");
while(!prc.waitForFinished(10))
{
if(qApp->hasPendingEvents())
{
// Sometimes it never returns from processEvents
qApp->processEvents(QEventLoop::AllEvents, 100);
}
}
qApp->removeEventFilter(&eventEater);
UPD: Похоже, это зависит от значения тайм-аута для QProcess::waitForFinished
.
Я разместил ту же ссылку, что и вы :) – fasked
Я знаю. Но вы реализуете это как белый список, а в связанном ответе есть черный список. И упомянутые типы событий различны. –
Я не могу просто отключить виджеты верхнего уровня, потому что речь идет не только о виджетах, но и во всем мире приложение захватывает клавиатуру. Кроме того, я пробовал до реализации черного списка, и я не знаю, как все события щелчка мыши все еще обрабатываются. В любом случае это временное решение, и теперь я просто хочу понять, почему 'processEvents' не возвращается только иногда, а не всегда. – fasked