在我的應用程序中,我需要等到外部程序(使用QProcess
)完成。我想讓應用程序負責,因此阻止方法是不可接受的。QApplication :: processEvents永遠不會返回
此外我需要禁止用戶輸入。我試圖讓QEventLoop
與QEventLoop::ExcludeUserInputEvents
標誌exec的,但因爲文件說,它只是延緩了事件處理:
事件不被丟棄;他們將在下一次
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