Python 关闭/删除QMdiArea子窗口的正确方法?
我有一个简单的应用程序,我正在使用PyQt4编写,它包括一个由QMdiArea组成的主窗口。当用户启动新会话(新实验)时,将生成两个窗口。用户还可以从分析模块列表中选择要运行的模块 我不希望允许任何窗口的任何重复(即,在下面的示例代码中,用户只能有一个文件树窗口、一个数据绘图窗口和/或一个单元格监视器窗口) 因此,例如,如果用户选择一次“新实验”,将生成两个窗口。如果他/她再次选择“新实验”,则应关闭原来的两个窗口,并打开两个新窗口。对于任何“分析模块”也是如此(即,选择一个已经打开的模块将导致打开的模块关闭,并打开一个新模块) 但是,我在生成此功能时遇到问题 首先,代码:Python 关闭/删除QMdiArea子窗口的正确方法?,python,qt,pyqt,qmdiarea,Python,Qt,Pyqt,Qmdiarea,我有一个简单的应用程序,我正在使用PyQt4编写,它包括一个由QMdiArea组成的主窗口。当用户启动新会话(新实验)时,将生成两个窗口。用户还可以从分析模块列表中选择要运行的模块 我不希望允许任何窗口的任何重复(即,在下面的示例代码中,用户只能有一个文件树窗口、一个数据绘图窗口和/或一个单元格监视器窗口) 因此,例如,如果用户选择一次“新实验”,将生成两个窗口。如果他/她再次选择“新实验”,则应关闭原来的两个窗口,并打开两个新窗口。对于任何“分析模块”也是如此(即,选择一个已经打开的模块将导致
class MainWindow(QtGui.QMainWindow):
def __init__(self, model):
super().__init__()
self.resize(1400, 800)
self.model = model
menubar = self.menuBar()
new_experiment_action = QtGui.QAction("New Experiment", self)
new_experiment_action.triggered.connect(self.setup_new_experiment)
file_menu = menubar.addMenu("File")
file_menu.addAction(new_experiment_action)
cell_health_action = QtGui.QAction("Cell Health Monitor", self)
cell_health_action.triggered.connect(self.setup_cell_health_window)
analysis_menu = menubar.addMenu("Analysis Modules")
analysis_menu.addAction(cell_health_action)
self.file_tree = None
self.file_tree_window = None
self.data_plot = None
self.data_plot_window = None
self.cell_health = None
self.cell_health_window = None
self.mdi = QtGui.QMdiArea()
self.setCentralWidget(self.mdi)
def setup_new_experiment(self):
self.mdi.closeAllSubWindows()
self.file_tree = FileTree(self.model)
self.file_tree.setMinimumSize(QtCore.QSize(200, 300))
self.data_plot = DataPlot(self.model)
self.data_plot.setMinimumSize(self.size()*.4)
self.file_tree_window = self.mdi.addSubWindow(self.file_tree)
self.file_tree_window.show()
self.data_plot_window = self.mdi.addSubWindow(self.data_plot)
self.data_plot_window.show()
def setup_cell_health_window(self):
if self.cell_health_window:
self.mdi.removeSubWindow(self.cell_health_window)
self.cell_health = CellHealthMonitor(self.model)
self.cell_health.setMinimumSize(self.size()*.3)
self.cell_health_window = self.mdi.addSubWindow(self.cell_health)
self.cell_health_window.show()
这在很多方面都不起作用:
- 如果我打开“Cell Health Monitor”窗口,请关闭它,然后尝试 重新打开它,Python崩溃了
- 如果打开一个“Cell Health Monitor”窗口,然后尝试开始一个“新实验”,然后打开一个“Cell Health Monitor”窗口,Python就会崩溃
def setup_new_experiment(self):
for window in self.mdi.subWindowList():
self.mdi.removeSubWindow(window)
self.file_tree = FileTree(self.model)
self.file_tree.setMinimumSize(QtCore.QSize(200, 300))
self.data_plot = DataPlot(self.model)
self.data_plot.setMinimumSize(self.size()*.4)
self.file_tree_window = self.mdi.addSubWindow(self.file_tree)
self.file_tree_window.show()
self.data_plot_window = self.mdi.addSubWindow(self.data_plot)
self.data_plot_window.show()
def setup_cell_health_window(self):
if self.cell_health_window:
self.mdi.removeSubWindow(self.cell_health_window)
self.cell_health = CellHealthMonitor(self.model)
self.cell_health.setMinimumSize(self.size()*.3)
self.cell_health_window = self.mdi.addSubWindow(self.cell_health)
self.cell_health_window.show()
根据Python崩溃或我收到以下两条错误消息之一的一系列操作:
(这实际上只是一个警告):
或
我不知道如何做才能在不产生这些问题的情况下删除子窗口
谢谢
QMdiArea::removeSubWindow: window is not inside workspace
Traceback (most recent call last):
File "MainWindow.py", line 61, in setup_cell_health_window
self.mdi.removeSubWindow(self.cell_health_window)
RuntimeError: wrapped C/C++ object of type QMdiSubWindow has been deleted