首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QApplication::processEvents永不返回

QApplication::processEvents永不返回
EN

Stack Overflow用户
提问于 2013-06-06 09:57:37
回答 1查看 1.8K关注 0票数 0

在我的应用程序中,我需要等待外部程序(使用QProcess)完成。我想让应用程序负责,所以阻塞方法是不可接受的。

此外,我需要不允许用户输入。我试图使用QEventLoop标记来制作QEventLoop::ExcludeUserInputEvents并执行它,但正如文档所述,它只会延迟事件的处理:

事件不会被丢弃;它们将在下一次不带ExcludeUserInputEvents标志的情况下调用ExcludeUserInputEvents时传递。

因此,我实现了简单的事件筛选器,并将其安装在qApp上(这个想法取自Qt Application: Simulating modal behaviour (enable/disable user input))。它工作得很好,但有时即使我指定了最大超时,QApplication::processEvents函数也永远不会返回。有谁能帮助我理解,因为它周期性发生的原因?

代码语言:javascript
运行
复制
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;
        }
    }
};

-

代码语言:javascript
运行
复制
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的超时值。

EN

回答 1

Stack Overflow用户

发布于 2013-06-06 10:13:34

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

此外,您也不应该使用return QObject::eventFilter(object, event);。您应该使用return false。将自动调用所有其他事件筛选器。

但是,对于我来说,这个解决方案似乎很奇怪,而且不合理,因为您只需调用setEnabled(false)作为顶级小部件来阻止用户输入,然后就可以使用QApplication::processEvents而不使用任何标志。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16959081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档