Правильный способ закрыть/удалить подокно QMdiArea?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Правильный способ закрыть/удалить подокно QMdiArea?

Сообщение Anonymous »

У меня есть простое приложение, которое я пишу с использованием PyQt 4, которое включает в себя MainWindow, состоящий из QMdiArea. Когда пользователь начинает новый сеанс (новый эксперимент), генерируются два окна. Пользователь также может выбрать из списка модули анализа для запуска.

Я не хочу, чтобы были разрешены дубликаты каких-либо окон (т. е. в приведенном ниже примере кода пользователь может иметь только одно file_tree_window, одно data_plot_window и/или одно cell_monitor_window).

Так, например, если пользователь один раз выбирает «Новый эксперимент», создаются два окна. Если он/она затем снова выберет «Новый эксперимент», эти два исходных окна должны быть закрыты и открыты два новых. То же самое справедливо и для любого из «Модулей анализа». (т. е. выбор уже открытого приведет к закрытию открытого и открытию нового).

Однако у меня возникли проблемы с созданием этой функции.

Во-первых, код:

Код: Выделить всё

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», и затем попытайтесь начать «Новый эксперимент», после чего откройте окно «Монитор работоспособности ячейки», Python выйдет из строя.
Я пытался используйте Remove() вместо close():

т.е.:

Код: Выделить всё

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
Я не знаю, что делать по-другому, чтобы удалить подокно без возникновения этих проблем.

Спасибо

Подробнее здесь: https://stackoverflow.com/questions/280 ... -subwindow
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Правильный способ закрыть/удалить подокно QMdiArea?
    Anonymous » » в форуме Python
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Закрыть подокно, не закрывая главное окно PyGTK в Python
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Как обработать Qt/QMDIArea «закрытое событие»?
    Anonymous » » в форуме C++
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Закрыть окно черепахи кнопкой X (закрыть)
    Anonymous » » в форуме Python
    0 Ответы
    34 Просмотры
    Последнее сообщение Anonymous
  • Как закрыть приложение из любого места в приложении GLFW + Dear Imgui (не только окно закрыть обратный вызов)?
    Anonymous » » в форуме C++
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»