You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5 如何让主窗口__init__中创建的子QWidget始终保持置顶显示

解决主窗口__init__内创建的QWidget无法始终置顶的问题

你遇到的问题来自两个核心原因:

  • 实例作用域问题:你在Ui_MainWindow的__init__方法中创建的Widget是局部变量,方法执行完成后没有其他引用指向该实例,会被Python垃圾回收机制自动销毁,自然无法正常留存并保持置顶。而你之前在全局作用域创建实例可以生效,正是因为全局变量不会被随意回收。
  • 窗口标志缺失:当前你仅为子控件添加了Qt.Dialog标志,要实现始终置顶效果,还需要额外添加QtCore.Qt.WindowStaysOnTopHint标志。

以下是修改后可正常运行的代码:

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)
        # 绑定为实例属性,避免被回收
        self.Widget = Ui_Widget(self)
        self.Widget.show()

class Ui_Widget(QWidget):
    def __init__(self,  parent=None):
        QWidget.__init__(self, parent)
        # 新增WindowStaysOnTopHint标志实现置顶
        self.setWindowFlags(self.windowFlags() | QtCore.Qt.Dialog | QtCore.Qt.WindowStaysOnTopHint)
        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()
    sys.exit(app.exec_())

补充说明:如果在Raspberry Pi OS的LXDE桌面环境下遇到置顶不生效的情况,可以在设置窗口标志时额外添加QtCore.Qt.Window,强制将该控件识别为独立顶层窗口。

内容的提问来源于stack exchange,提问作者ramiwi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:36:01