目前我正在開發Qt程序。爲了防止用戶使用時長的任務正在運行的應用程序進行交互,我通過調用Qt - 將光標更改爲沙漏並禁用光標
但是試過overriding the cursor,鼠標點擊事件不會被禁用。
有什麼辦法可以禁用鼠標點擊事件而不禁用GUI的所有小部件?
目前我正在開發Qt程序。爲了防止用戶使用時長的任務正在運行的應用程序進行交互,我通過調用Qt - 將光標更改爲沙漏並禁用光標
但是試過overriding the cursor,鼠標點擊事件不會被禁用。
有什麼辦法可以禁用鼠標點擊事件而不禁用GUI的所有小部件?
我花了很多時間來找到一種方法來實際上阻止用戶在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);
setOverrideCursur只改變光標外觀。 要禁用用戶輸入,可以在事件循環中彈出進度對話框或過濾鼠標/鍵盤事件。
這是一個幫助我的應用程序的不同方法:在處理用戶事件時,通常只有在當前正在運行的任務調用Q(Core)Application :: processEvents()時才處理新的鼠標點擊/按鈕按下。這通常用於強制重新繪畫,例如當進度條變化時。請注意,這也可能是任何基於Qt的第三方庫的一部分。
如果更改這些調用
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
鼠標點擊你的長期任務,在此期間發生的任務完成後,將被處理。當然,有些情況下您不希望延遲用戶輸入事件,因此您必須檢查每個processEvents()調用的情況。
如果你的第三方庫有processEvents()調用,你不能改變它們,你將會陷入我害怕的同樣的問題。
processEvents可能會非常棘手,特別是如果你收到一個Quit- processEvents中的通知。除鼠標事件外,鍵盤事件也會被過濾。因此關閉應用程序也可能被禁用。 – Jens
長期任務的中斷確實是一個問題。如果你想這樣做,我想自己的事件循環將是唯一的可能性。 –