繁体   English   中英

PyQt5 保持 QWidget 始终在顶部

[英]PyQt5 keep a QWidget always on top

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

当在应用程序范围内创建小部件时,它只对我有用(如这里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_())

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

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

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

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

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_())

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM