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