A herança tripla causa conflito de metaclasse… Às vezes
Parece que eu me deparei com um inferno de metaclasse, mesmo quando não queria nada com iss
Estou escrevendo um aplicativo no Qt4 usando PySide. Desejo separar a parte orientada a eventos da definição da interface do usuário, gerada a partir dos arquivos do Qt Designer. Por isso, crio classes de "controladores", mas para facilitar minha vida, eu as herdo de várias maneiras. Um exemplo
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)
This obras como esperado. Ele também tem herança de QDialog
, Ui_Dialog
, BaseController
). Mas quando eu subclasseBaseController
e tente herdar da referida subclasse (no lugar deBaseController
), Recebo um erro:
TypeError: erro ao chamar o conflito de metaclasse de bases de metaclasses: a metaclasse de uma classe derivada deve ser uma subclasse (não estrita) das metaclasses de todas as suas bases
Clarificação: AmbosQMainWindow
eQDialog
herdar deQObject
. BaseController
também deve herdar dele devido às peculiaridades do sistema de eventos Qt. As classes Ui_ herdam apenas da classe de objeto Python simples. Procurei soluções, mas todas elas envolvem casos de uso intencional de metaclasses. Então, devo estar fazendo algo terrivelmente errad
EDIT: Minha descrição pode ser mais clara adicionando gráfico
Exemplo de trabalho:
QObject
| \___________________
| object |
QMainWindow | BaseController
| /---Ui_MainWindow |
| | MainController
MainWindow-----------------/
Outro exemplo de trabalho:
QObject
| \___________________
| object |
QDialog | BaseController
| /---Ui_OtherWindow |
| | |
OtherWindow----------------/
Nem exemplo de trabalho:
QObject
| \___________________
| object |
QDialog | BaseController
| /---Ui_OtherWindow |
| | OtherController
OtherWindow----------------/