Как избежать двойного наследования - PullRequest
0 голосов
/ 20 мая 2018

Я пытаюсь разработать приложение qt и решил создать абстрактный класс с именем window, который наследует от QWidget каждое окно, diaoluge будет наследовать от нее и будет включать основные свойства, которые должно иметь окно.Прямо сейчас один из классов, который наследуется от окна, также наследуется от QMainWindow.Моя проблема заключается в том, что QMainWindow и window наследуются от QWidget.Это заставляет меня думать, что мой способ решения субоптимален, и есть правильный способ сделать обобщение, которое я пытаюсь сделать, любой совет будет приветствоваться.

Вот код для референции (удаленные неважные части)с двойным наследованием:

class Window(QtGui.QWidget , ):
    _metaclass__ = ABCMeta
    def __init__(self, win_name):
        super(Window, self).__init__()
        self.name = win_name
        self.initUI()

    def initUI(self, ):
        self.setWindowTitle(self.name)

        self.show()


class Main_Window(QtGui.QMainWindow,  Window):

    def __init__(self, win_name):
        super(Main_Window, self).__init__(win_name)
        self.initUI()

    def initUI(self, ):
        self.statusBar().showMessage('chk')
        self.setGeometry(300, 300, 250, 150)
        super(Main_Window, self).initUI()

1 Ответ

0 голосов
/ 25 мая 2018

Другой вариант, вместо использования наследования, будет использовать состав , вот небольшой пример:

import sys

from PyQt5.Qt import *  # noqa


class GuiBuilder():
    def __init__(self, widget, name):
        self.widget = widget
        self.name = name
        self.init_ui()

    def init_ui(self):
        self.widget.setWindowTitle(self.name)


class MainWindow(QMainWindow):

    def __init__(self, name):
        super().__init__()

        self.gui_builder = GuiBuilder(self, name)
        self.init_ui()

    def init_ui(self):
        self.statusBar().showMessage('chk')
        self.setGeometry(300, 300, 250, 150)
        self.gui_builder.init_ui()


def main():
    app = QApplication(sys.argv)

    for title in ["window1", "window2", "window3"]:
        ex = MainWindow(title)
        ex.show()

    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

Как вы можете видеть, я немного рефакторил ваш опубликованный код, измененный Window byGuiBuilder, стиль Pep8, ... Конечно, приведенный выше пример не имеет особого смысла, и вы бы просто использовали этот подход, если бы для этого были веские причины. KISS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...