在我的应用程序中,我需要等到外部程序(使用QProcess
)完成。我想让应用程序负责,因此阻止方法是不可接受的。
我还需要禁止用户输入。我试图QEventLoop
用标志来制作和执行它QEventLoop::ExcludeUserInputEvents
,但正如文档所说,它只会延迟事件处理:
事件不会被丢弃;他们将在下一次
processEvents()
被调用时交付,而不带ExcludeUserInputEvents
标志。
所以我实现了简单的事件过滤器并将其安装qApp
(这个想法来自Qt Application: Simulating modal behavior (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
.