Это делает решение трехстрочным и довольно понятным.
е, я наткнулся на ад метакласса, даже когда не хотел иметь с этим ничего общего.
Я пишу приложение в Qt4, используя PySide. Я хочу отделить управляемую событиями часть от определения пользовательского интерфейса, которое генерируется из файлов Qt Designer. Поэтому я создаю классы «контроллера», но чтобы облегчить свою жизнь, я все равно наследую их по нескольку раз. Пример:
class BaseController(QObject):
def setupEvents(self, parent):
self.window = parent
class MainController(BaseController):
pass
class MainWindow(QMainWindow, Ui_MainWindow, MainController):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
, self.setupEvents(self)
Это работает как ожидалось. Он также имеет наследование от (QDialog
, Ui_Dialog
, BaseController
). Но когда я подклассBaseController
и попытаться унаследовать от указанного подкласса (вместоBaseController
) Я получаю сообщение об ошибке:
Ошибка типа: ошибка при вызове конфликта метакласса баз метаклассов: метакласс производного класса должен быть (нестрогим) подклассом метаклассов всех его баз
Пояснение: обаQMainWindow
а такжеQDialog
наследовать отQObject
. BaseController
также должен наследовать от него из-за особенностей системы событий Qt. Классы Ui_ наследуются только от простого класса объектов Python. Я искал решения, но все они включают случаи преднамеренного использования метаклассов. Поэтому я, должно быть, делаю что-то ужасно неправильно.
РЕДАКТИРОВАТЬ: мое описание может быть понятнее, добавив графики.
Рабочий пример:
QObject
| \___________________
| object |
QMainWindow | BaseController
| /---Ui_MainWindow |
| | MainController
MainWindow-----------------/
Еще один рабочий пример:
QObject
| \___________________
| object |
QDialog | BaseController
| /---Ui_OtherWindow |
| | |
OtherWindow----------------/
Не рабочий пример:
QObject
| \___________________
| object |
QDialog | BaseController
| /---Ui_OtherWindow |
| | OtherController
OtherWindow----------------/