0

在我的应用程序中,我需要等到外部程序(使用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.

4

1 回答 1

2

我猜您正在过滤一些有用的事件(例如,QEvent::SockAct可能涉及)。尝试添加一些调试输出并找出您实际过滤的事件类型。或者,最好指定要阻止的事件的黑名单,而不是要允许的事件的白名单。看到这个答案

你也不应该使用return QObject::eventFilter(object, event);. 你应该使用return false. 所有其他事件过滤器将被自动调用。

然而,这个解决方案对我来说似乎很奇怪和不合理,因为你可以调用setEnabled(false)你的顶级小部件来阻止用户输入,然后你可以QApplication::processEvents在没有任何标志的情况下使用。

于 2013-06-06T10:13:34.120 回答