Наиболее очевидный подход для меня - объявить каждое окно (окно, диалог или виджет) в конструкторе и вызвать метод show () при необходимости. Примерно так:
class MultiWindowApp():
def __init__(self):
self.window_1 = self.init_window_1()
self.window_2 = self.init_window_2()
def init_window_1(self):
gui = uic.loadUi(...)
# other settings
return gui
def init_window_2(self):
gui = uic.loadUi(...)
# other settings
return gui
def show_window_1(self):
self.window_1.show()
def show_window_2(self):
self.window_2.show()
Тем не менее, это не похоже на использование памяти, потому что я храню windows в памяти все время, даже когда не показываю.
Альтернативное решение, которое мне приходит в голову, - создать отдельный класс для каждого окна (или другого виджета) и иметь один заполнитель для всех в основном классе. Назначьте экземпляр соответствующего класса и удалите при закрытии окна. Ниже приведен минимальный пример:
class Window_1(QWidget):
def __init__(self):
QWidget.__init__(self)
uic.loadUi(...)
# other settings
self.show()
class Window_2(QWidget):
def __init__(self):
QWidget.__init__(self)
uic.loadUi(...)
# other settings
self.show()
class MultiWindowApp():
def __init__(self):
self.widget_placeholder = None
def show_window_1(self):
self.widget_placeholder = Window_1()
def show_window_2(self):
self.widget_placeholder = Window_1()
Это будет немного медленнее, но я бы не стал хранить в памяти ненужные вещи. Тем не менее, у меня все еще есть ощущение, что есть лучший путь. Как правильно проектировать такое приложение?
Я не запускал приведенные выше примеры, поэтому могут быть некоторые ошибки, но я думаю, что лежащие в их основе концепции ясны.