Как правильно реализовать модель MVC с PyQt5 с несколькими представлениями? - PullRequest
0 голосов
/ 12 января 2019

Это мой первый проект, который имеет более одного окна. Я изо всех сил пытаюсь правильно реализовать модель MVC.

С большой помощью пользователя 101 пост на эту тему я начал свой проект. Это работает, но я не уверен, какая часть классов MVC должна обрабатывать открытие нового окна.

App.py

import sys
from PyQt5 import Qt
from model.Model import Model
from ctrls.MainController import MainController
from views.MainView import MainView
from views.SettingsView import SettingsView


class App(Qt.QApplication):
    def __init__(self, sys_argv):
        super(App, self).__init__(sys_argv)
        self.model = Model()
        self.main_ctrl = MainController(self.model)
        self.main_view = MainView(self.model, self.main_ctrl)
        self.settings_view = SettingsView(self.model, self.main_ctrl)
        self.main_view.show()

        # This works, but should be shown after I pressed the Settings-button
        self.settings_view.show()


if __name__ == '__main__':
    app = App(sys.argv)
    sys.exit(app.exec_())

Очевидно, что окно настроек следует открывать не сразу, а после того, как пользователь нажимает кнопку «Настройки» в представлении MainWindow.

from PyQt5 import QtWidgets


class MainController(object):

    def __init__(self, model):
        self.model = model

    #### widget event functions ####

    def change_exit(self, checked):
        self.model.exit = checked
        print(f'DEBUG: change_exit called with arg value: {checked}')

    def change_settings(self, checked):
        self.model.settings = checked
        print(f'DEBUG: change_settings called with arg value: {checked}')

    def change_startjaar(self, index):
        self.model.startjaar = index
        print('DEBUG: change_startjaar called with arg value:', index)

    def change_startmaand(self, index):
        self.model.startmaand = index
        print('DEBUG: change_startmaand called with arg value:', index)

    def change_uurtarief(self, text):
        self.model.uurtarief = text
        print('DEBUG: change_uurtarief called with arg value:', text)

    def change_huur(self, text):
        self.model.huur = text
        print('DEBUG: change_huur called with arg value:', text)

    def change_OK(self, checked):
        self.model.OK = checked
        print('DEBUG: change_OK called with arg value:', checked)

    def change_cancel(self, checked):
        self.model.cancel = checked
        print('DEBUG: change_cancel called with arg value:', checked)

Контроллер получает событие для запуска окна настроек, но, поскольку у контроллера нет дескриптора представления настроек, он не может его запустить.

Должен ли я предоставить все представления в качестве ссылки на MainController? Основной App.py создает все экземпляры, чтобы это могло работать, но я не уверен, что это правильно. Пожалуйста, просветите меня.

Кредиты

Часть кода генерируется с помощью этого проекта на Github. Весь мой проект можно найти здесь , так как я пытался показать только соответствующие части.

...