如何制作*** QWidget 模态?
Posted
技术标签:
【中文标题】如何制作*** QWidget 模态?【英文标题】:How to make the top QWidget modal? 【发布时间】: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 作为值,它们产生相同的行为。
我担心这可能是一个设计限制,以避免应用程序阻塞其他应用程序,但我不确定,我无法确认。
我在这里遗漏了一些明显的东西吗?如果问题是设计限制,有没有办法仍然模拟模态窗口?
【问题讨论】:
【参考方案1】:模态仅针对当前应用。如果应用程序只有一个打开的***窗口,那么应用程序和窗口模式之间没有区别。这种模式对其他应用程序没有影响,所以你不能用它来实现你想要的,没有简单的“桌面模式”标志。
您可以使用 Qt 制作窗口full screen,但您必须使用其他方式来阻止用户访问桌面或关闭应用程序(通常绑定到 ALT-F4 键盘快捷键)。如果您的平台是 Windows,那么我不知道该怎么做,但我相信有办法。在 X11(通常在 Linux 上使用)下,最直接的方法是根本没有桌面,只需在没有桌面的情况下运行应用程序即可。查找 nodm 包以获得简单的方法。
【讨论】:
使用全屏方式是一种方法,但这需要做很多额外的工作,因为它不仅要阻止 ALT+F4 组合,还有其他像 ALT+TAB 之类的“菜单” " 键(在 CTRL 和 ALT 之间)...虽然可行,但我认为这带来的问题多于好处。不过,我会检查nodm
包。
确实如此,但所有这些快捷方式都由桌面管理器处理。没有桌面管理器 -> 没问题(至少就这些快捷方式而言)。以上是关于如何制作*** QWidget 模态?的主要内容,如果未能解决你的问题,请参考以下文章
setCentralWidget就可以把Qwidget设置为QMainWindow的主窗口
Qt - QDialog,QWidget实现模态及非模态(模态Widget不能有父窗口,如果设置无边框就不能阻塞父窗口,但是可以强行设置指定Qt::Dialog,还可以setAttribute(Qt: