【问题标题】:PyQt5 keep a QWidget always on topPyQt5 保持 QWidget 始终在顶部
【发布时间】:2021-12-09 09:47:51
【问题描述】:

在我的主窗口初始化函数中创建子小部件时,我可以强制它保持在顶部吗?

只有在应用范围内创建小部件时它才对我有用(如此处PyQt4 How keep a QWidget always on top?)。

(在树莓派操作系统上测试)

from PyQt5 import QtCore
from PyQt5.QtWidgets import (
    QApplication, QMainWindow, QWidget
)

class Ui_MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setWindowTitle("MainWindow")
        self.resize(400, 300)
        Widget = Ui_Widget(self)
        Widget.show()

class Ui_Widget(QWidget):
    def __init__(self,  parent=None):
        QWidget.__init__(self, parent)
        self.setWindowFlags(self.windowFlags() | QtCore.Qt.Dialog)
        self.setWindowTitle("Widget")
        self.resize(400, 300)
        self.move(200, 150)

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    MainWindow = Ui_MainWindow()
    MainWindow.show()
    # Widget = Ui_Widget(MainWindow)
    # Widget.show()

    sys.exit(app.exec_())

【问题讨论】:

  • 你的意思是用上面的代码Ui_Widget显示在主窗口下面吗?您使用的是什么操作系统?
  • @musicamante 是的,在 Raspberry Pi OS 的主窗口下。刚刚在运行良好的 Windows 10 上进行了测试。
  • 可能是窗口管理器的问题。如果您单击子窗口并尝试再次单击主窗口,它会再次回到顶部吗?尝试在创建Ui_Widget 实例之前添加self.show()
  • @musicamante 你的把戏搞定了!谢谢!

标签: python raspberry-pi pyqt pyqt5


【解决方案1】:

问题可能与窗口管理器中的一些错误或错误实现有关(在 Fluxbox 上它按预期工作)。

在任何情况下,为了保持一致性,您不应该在显示父小部件之前显示子小部件(假设两者必须同时出现):MainWindow.show() 被称为之后 __init__ 已被处理,结果是您过早地显示子小部件。

基本的解决方法是在显示子小部件之前调用self.show(),但通常认为__init__ 中显示小部件(包括实例本身)是一种好的做法。 p>

更好的解决方案是创建一个实际显示父小部件的函数,然后创建并显示子小部件:

class Ui_MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setWindowTitle("MainWindow")
        self.resize(400, 300)

    def start(self):
        self.show()
        Widget = Ui_Widget(self)
        Widget.show()

# ...

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    MainWindow = Ui_MainWindow()
    MainWindow.start()

    sys.exit(app.exec_())

请注意,对于 非常 特定情况,通常需要为标准 QWidgets 使用 Dialog 标志。大多数时候,您可以只使用 QDialog 并调用 open() 而不是 show()。您还应该为子窗口小部件创建一个持久引用,因为您可能需要从主窗口类访问它。
另请注意,名为 Ui_xyz 的类通常用于基本 UI 表单(使用 pyuic/pyside-uic 创建的那些),并且变量不应具有大写名称,因为只有类和常量使用此约定(首选 mainWindow 而不是 @ 987654331@).

【讨论】:

    猜你喜欢
    • 2011-06-24
    • 2018-11-26
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多