【问题标题】:How to make the top QWidget modal?如何制作顶级 QWidget 模态?
【发布时间】:2016-10-31 17:16:39
【问题描述】:

我正在 PyQT5 中开发一个应用程序,其顶部有一个 QWidget 对象。此应用程序需要能够在“信息亭”模式下运行,因此我的目标是使该顶部 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 窗口对单个窗口是模态的 层次结构和块输入到其父窗口,所有祖父 windows 及其父窗口和祖父窗口的所有兄弟窗口。

Qt.ApplicationModal 2 窗口对应用程序是模态的,并且 阻止所有窗口的输入。

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

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

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

【问题讨论】:

    标签: qt pyqt pyqt5


    【解决方案1】:

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

    您可以使用 Qt 制作窗口full screen,但您必须使用其他方式来阻止用户访问桌面或关闭应用程序(通常绑定到 ALT-F4 键盘快捷键)。如果您的平台是 Windows,那么我不知道该怎么做,但我相信有办法。在 X11(通常在 Linux 上使用)下,最直接的方法是根本没有桌面,只需在没有桌面的情况下运行应用程序即可。查找 nodm 包以获得简单的方法。

    【讨论】:

    • 使用全屏方式是一种方法,但这需要做很多额外的工作,因为它不仅要阻止 ALT+F4 组合,还有其他像 ALT+TAB 之类的“菜单” " 键(在 CTRL 和 ALT 之间)...虽然可行,但我认为这带来的问题多于好处。不过,我会检查 nodm 包。
    • 确实如此,但所有这些快捷方式都由​​桌面管理器处理。没有桌面管理器 -> 没问题(至少就这些快捷方式而言)。
    猜你喜欢
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    相关资源
    最近更新 更多