如何制作顶级QWidget模式?

时间:2016-10-31 17:16:40

标签: qt pyqt pyqt5

我正在PyQT5中开发一个应用程序,它在顶部有一个QWidget对象。此应用程序需要能够以“kiosk”模式运行,因此我的目标是制作顶级QWidget模式,并防止任何其他正在运行的应用程序被聚焦。

主要类的骨架如下。请注意,我正在调用setWindowModality()方法,理论上将窗口的行为设置为所选择的方法:

class MyApp(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.setWindowModality(3)

我的主要方法如下:

app = QApplication(sys.argv)
MyApp()
sys.exit(app.exec_())

根据setWindowModality()方法documentation

  

Qt.NonModal 0窗口不是模态的,不会阻止对其他窗口的输入。

     

Qt.WindowModal 1窗口是单个窗口的模态   层次结构和块输入到其父窗口,所有祖父母   窗户,以及父母和祖父母窗户的所有兄弟姐妹。

     

Qt.ApplicationModal 2该窗口是应用程序的模态和   阻止输入到所有窗口。

问题是窗口根本不是模态的,我可以切换到不同的应用程序(比如Web浏览器),这正是我想要阻止的。我也尝试过1,2,3作为值,它们会产生相同的行为。

我担心这可能是设计限制,以避免应用程序阻止其他应用程序,但我不确定它,我无法确认。

我错过了一些明显的东西吗?如果问题是设计限制,有没有办法仍然模拟模态窗口?

1 个答案:

答案 0 :(得分:2)

模态仅适用于当前的应用程序。如果应用程序只有一个打开的顶级窗口,那么应用程序和窗口模式之间没有区别。这种模式对其他应用程序没有影响,所以你无法用它实现你想要的东西,没有简单的“桌面模态”标志。

您可以使用Qt创建窗口full screen,但您必须使用其他方法来阻止用户访问桌面或关闭应用程序(通常绑定到ALT-F4键盘快捷键)。如果您的平台是Windows,那么我不知道该怎么做,但我确定有办法。在X11(通常在Linux上使用)下,最简单的方法就是没有桌面,只需运行没有桌面的应用程序即可。查找 nodm 包,以便轻松实现此目的。