我目前正在开发一款Qt程序。为了防止用户在执行长时间任务时与应用程序进行交互,我尝试通过调用覆盖光标来实现。
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
然而,鼠标单击事件并没有被禁用。
是否有办法在不禁用GUI的所有小部件的情况下禁用鼠标单击事件?
我目前正在开发一款Qt程序。为了防止用户在执行长时间任务时与应用程序进行交互,我尝试通过调用覆盖光标来实现。
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
然而,鼠标单击事件并没有被禁用。
是否有办法在不禁用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);
QApplication::processEvents( QEventLoop::ExcludeUserInputEvents );
setOverrideCursur 只改变光标外观。 要禁用用户输入,您可以弹出进度对话框或在事件循环中过滤鼠标/键盘事件。