Qt应用程序:模拟模态行为(启用/禁用用户输入)

And*_*pov 2 c++ qt qt4

我目前正在开发一个应用程序,该应用程序可以启动显示其他对话框的单独进程。我试图实现的功能是模拟这些对话框的模态行为。更具体地说,我需要该应用程序在启动对话框时停止处理所有输入(包括鼠标和键盘),并在关闭对话框时恢复处理。

将对话框保留在应用程序的顶部并不是很重要,尽管如果您可以建议如何在不依靠Always-On-Top行为的情况下做到这一点,那也很好。

注意,该应用程序是在Windows和Linux下编译的。另外,也不可以直接启动对话框。它们在单独的可执行文件中。此外,该应用程序是一个非常复杂的软件,因此不能单独禁用小部件,或者至少不是一个非常可行的选项。

我在Qt 3.3的QApplication类中找到了lock()unlock()函数。我们目前正在使用Qt 4.5,它似乎没有该API。实际上,Qt 4.5 QApplication类似乎也不提供对事件循环的访问。

总结一下:如何禁用/启用Qt应用程序中的用户输入,包括鼠标和键盘快捷键?

And*_*pov 5

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)