在我的应用程序中,我需要等待外部程序(使用QProcess)完成。我想让应用程序负责,所以阻塞方法是不可接受的。
此外,我需要不允许用户输入。我试图使用QEventLoop标记来制作QEventLoop::ExcludeUserInputEvents并执行它,但正如文档所述,它只会延迟事件的处理:
事件不会被丢弃;它们将在下一次不带
ExcludeUserInputEvents标志的情况下调用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的超时值。
发布于 2013-06-06 10:13:34
我猜您正在过滤一些有用的事件(例如,可能涉及到QEvent::SockAct )。尝试添加一些调试输出,并找出实际筛选的事件类型。或者,最好指定要阻止的事件的黑名单,而不是要允许的事件的白列表。见this answer。
此外,您也不应该使用return QObject::eventFilter(object, event);。您应该使用return false。将自动调用所有其他事件筛选器。
但是,对于我来说,这个解决方案似乎很奇怪,而且不合理,因为您只需调用setEnabled(false)作为顶级小部件来阻止用户输入,然后就可以使用QApplication::processEvents而不使用任何标志。
https://stackoverflow.com/questions/16959081
复制相似问题