2011-07-05 152 views

回答

8

我花了很多時間來找到一種方法來實際上阻止用戶在Qt中的交互,並且事件過濾似乎是一個可接受的解決方案。

下面的例子:

class AppFilter : public QObject 
{ 
protected: 
    bool eventFilter(QObject *obj, QEvent *event); 
}; 

bool AppFilter::eventFilter(QObject *obj, QEvent *event) 
{ 
    switch (event->type()) 
    { 
    //list event you want to prevent here ... 
    case QEvent::KeyPress: 
    case QEvent::KeyRelease: 
    case QEvent::MouseButtonRelease: 
    case QEvent::MouseButtonPress: 
    case QEvent::MouseButtonDblClick: 
    //... 
    return true; 
    } 
    return QObject::eventFilter(obj, event); 
} 

然後,當你什麼鎖:

qapp->setOverrideCursor(Qt::WaitCursor); 
qapp->installEventFilter(filter); 

和解鎖:

while(qapp->overrideCursor()) //be careful application may have been lock several times ... 
    qapp->restoreOverrideCursor(); 
qapp->removeEventFilter(filter); 
0

setOverrideCursur只改變光標外觀。 要禁用用戶輸入,可以在事件循環中彈出進度對話框或過濾鼠標/鍵盤事件。

0

這是一個幫助我的應用程序的不同方法:在處理用戶事件時,通常只有在當前正在運行的任務調用Q(Core)Application :: processEvents()時才處理新的鼠標點擊/按鈕按下。這通常用於強制重新繪畫,例如當進度條變化時。請注意,這也可能是任何基於Qt的第三方庫的一部分。

如果更改這些調用

QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); 

鼠標點擊你的長期任務,在此期間發生的任務完成後,將被處理。當然,有些情況下您不希望延遲用戶輸入事件,因此您必須檢查每個processEvents()調用的情況。

如果你的第三方庫有processEvents()調用,你不能改變它們,你將會陷入我害怕的同樣的問題。

+0

processEvents可能會非常棘手,特別是如果你收到一個Quit- processEvents中的通知。除鼠標事件外,鍵盤事件也會被過濾。因此關閉應用程序也可能被禁用。 – Jens

+0

長期任務的中斷確實是一個問題。如果你想這樣做,我想自己的事件循環將是唯一的可能性。 –