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
相关产品推荐
相关产品推荐

