我目前正在开发一个应用程序,该应用程序可以启动显示其他对话框的单独进程。我试图实现的功能是模拟这些对话框的模态行为。更具体地说,我需要该应用程序在启动对话框时停止处理所有输入(包括鼠标和键盘),并在关闭对话框时恢复处理。
将对话框保留在应用程序的顶部并不是很重要,尽管如果您可以建议如何在不依靠Always-On-Top行为的情况下做到这一点,那也很好。
注意,该应用程序是在Windows和Linux下编译的。另外,也不可以直接启动对话框。它们在单独的可执行文件中。此外,该应用程序是一个非常复杂的软件,因此不能单独禁用小部件,或者至少不是一个非常可行的选项。
我在Qt 3.3的QApplication类中找到了lock()和unlock()函数。我们目前正在使用Qt 4.5,它似乎没有该API。实际上,Qt 4.5 QApplication类似乎也不提供对事件循环的访问。
总结一下:如何禁用/启用Qt应用程序中的用户输入,包括鼠标和键盘快捷键?
gj已经提出了该解决方案,但我想我将实现粘贴进来仅供参考:
实现一个过滤器类,它将吸收用户的输入操作。
class BusyAppFilter : public QObject
{
protected:
bool eventFilter( QObject *obj, QEvent *event );
};
bool BusyAppFilter::eventFilter(QObject *obj, QEvent *event)
{
switch ( event->type() )
{
case QEvent::KeyPress:
case QEvent::KeyRelease:
case QEvent::MouseButtonPress:
case QEvent::MouseButtonDblClick:
case QEvent::MouseMove:
case QEvent::HoverEnter:
case QEvent::HoverLeave:
case QEvent::HoverMove:
case QEvent::DragEnter:
case QEvent::DragLeave:
case QEvent::DragMove:
case QEvent::Drop:
return true;
default:
return QObject::eventFilter( obj, event );
}
}
Run Code Online (Sandbox Code Playgroud)
然后将此代码放在您的QApplication类中:
QCursor busyCursor( Qt::WaitCursor );
setOverrideCursor( busyCursor );
BusyAppFilter filter;
installEventFilter( &filter ) ;
//... do the process stuff ...
removeEventFilter( &filter );
restoreOverrideCursor();
Run Code Online (Sandbox Code Playgroud)