2013-06-06 206 views
0

在我的應用程序中,我需要等到外部程序(使用QProcess)完成。我想讓應用程序負責,因此阻止方法是不可接受的。QApplication :: processEvents永遠不會返回

此外我需要禁止用戶輸入。我試圖讓QEventLoopQEventLoop::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的超時值。

回答

2

我想你正在過濾一些有用的事件(例如,可能涉及QEvent::SockAct)。嘗試添加一些調試輸出,並找出您實際篩選的事件類型。或者,最好指定要阻止的事件的黑名單,而不是要允許的白名單。見this answer。您也可以使用return QObject::eventFilter(object, event);。你應該使用return false。所有其他事件過濾器將自動調用。

然而,這個解決方案對我來說似乎很奇怪,也不合理,因爲您可以撥打setEnabled(false)作爲頂級小工具來阻止用戶輸入,然後您可以使用QApplication::processEvents而不帶任何標誌。

+0

我發佈了和你一樣的鏈接:) – fasked

+0

我知道。但是,您將其作爲白名單實施,並且在鏈接的答案中有一個黑名單。並提到事件類型是不同的。 –

+0

我不能只是禁用頂級小部件,因爲它不僅僅是小部件,應用程序全局捕獲鍵盤輸入。此外,我已經嘗試過黑名單實施之前,我不知道如何,但鼠標點擊事件仍然處理。在任何情況下,這都是臨時解決方案,現在我只想了解爲什麼'processEvents'不僅僅是有時而不是總是返回。 – fasked

相關問題