Как правильно спроектировать многооконное приложение в Qt (PyQt)? - PullRequest
0 голосов
/ 04 марта 2020

Наиболее очевидный подход для меня - объявить каждое окно (окно, диалог или виджет) в конструкторе и вызвать метод 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()

Это будет немного медленнее, но я бы не стал хранить в памяти ненужные вещи. Тем не менее, у меня все еще есть ощущение, что есть лучший путь. Как правильно проектировать такое приложение?

Я не запускал приведенные выше примеры, поэтому могут быть некоторые ошибки, но я думаю, что лежащие в их основе концепции ясны.

...