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

PyQt5:点击菜单选项后在MDI Area中打开Widget窗体的实现方法

在Qt MainWindow的MdiArea中打开WidgetForm的实现方法

嗨,我来帮你搞定这个问题!你现在的代码是把Devices Widget当成独立窗口弹出来了,要把它放进MdiArea里,只需要做几个小修改就行:

核心修改:把Widget作为Mdi子窗口添加

你需要把原来直接调用show()的逻辑,改成将Widget包装成QMdiSubWindow,再添加到MdiArea中。修改你的Devices方法如下:

def Devices(self):
    # 1. 创建Mdi子窗口容器
    sub_window = QtWidgets.QMdiSubWindow()
    # 2. 初始化你的Devices Widget(这部分和你原来的逻辑一致)
    self.Form_device = QtWidgets.QWidget()
    self.ui = Ui_Form_device()
    self.ui.setupUi(self.Form_device)
    # 3. 将Widget设置为子窗口的内部部件
    sub_window.setWidget(self.Form_device)
    # 4. 给子窗口设置标题(可选,方便区分不同子窗口)
    sub_window.setWindowTitle("Devices")
    # 5. 将子窗口添加到MdiArea并显示
    self.mdiArea.addSubWindow(sub_window)
    sub_window.show()

关键前提:确保MdiArea对象已正确关联

要注意,你的Ui_MainWindow类里必须能访问到MdiArea的实例——因为你是在Qt Designer里拖的MdiArea,所以setupUi方法里应该已经自动生成了self.mdiArea = QtWidgets.QMdiArea(MainWindow)这类代码,确认这个对象存在就行。

可选优化:避免重复打开相同窗口

如果不想每次点击菜单都新建一个Devices窗口,可以在创建前先检查MdiArea里是否已有该窗口,有的话直接激活它:

def Devices(self):
    # 遍历现有子窗口,检查是否已存在Devices窗口
    for sub_window in self.mdiArea.subWindowList():
        if sub_window.windowTitle() == "Devices":
            self.mdiArea.setActiveSubWindow(sub_window)
            return
    
    # 没有找到的话再创建新窗口
    sub_window = QtWidgets.QMdiSubWindow()
    self.Form_device = QtWidgets.QWidget()
    self.ui = Ui_Form_device()
    self.ui.setupUi(self.Form_device)
    sub_window.setWidget(self.Form_device)
    sub_window.setWindowTitle("Devices")
    self.mdiArea.addSubWindow(sub_window)
    sub_window.show()

最后一步:关联菜单触发信号

确保你的菜单选项已经和Devices方法绑定——如果是在Qt Designer里设置的,直接给菜单动作指定槽函数为Devices即可;如果是手动代码绑定,在setupUi方法末尾加上:

# 假设你的菜单动作对象名叫actionDevices,根据实际情况修改
self.actionDevices.triggered.connect(self.Devices)

这样点击菜单选项后,Devices Widget就会在MdiArea里以子窗口的形式打开啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:36:26