2015-04-19 3 views
2

Я хотел бы создать новый класс, который наследует два подкласса QWidget. Я знаю, что multi-inheritance невозможно в pyqt, но как мне удалось получить свойства обоих родительских классов в одном подклассе?pyqt5 и множественное наследование

То, что я хотел бы сделать это следующим образом:

class A(QWidget): 

    def __init__(self, widget, parent=None): 
     widget.destroyed.connect(self.destroy_handler) 

    @pyqtSlot() 
    def destroy_handler(self): 
     pass 

class B (A, QStatusBar): 
    def __init__(self, widget, parent=None): 
     A.__init__(self, widget) 
     QStatusBar.__init__(self, parent) 

    @pyqtSlot() 
    def destroyed_handler(self): 
     print("Destroyed") 

ответ

2

я наконец-то нашел, как это сделать: в первую очередь, проблемы пришли из A и QStatusBar наследуя QWidget. Мы не можем изменить QStatusBar, поэтому мы должны чейнджера А. А, не должен наследовать QWidget: так давайте создадим еще один класс, A-интерфейс, как и что:

class AInterface(QObject): 
    def __init__(self, a, parent=None) 
     super().__init__(parent=parent) 
     self.a = a 
     self.connect_signal() 

    def connect_signal(self, widget): 
     widget.destroyed.connect(self.handler) 

    @pyqtSlot() 
    def handler(self): 
     self.a.handler() 

А имеет теперь следующую реализацию:

class A: 
    def __init__(self, widget): 
     a.widget = widget 
     a.interface = AInterface(self) 

    def handler(self): 
     pass 

Таким образом, теперь мы можем создать подклассы наследуя не только, но и любой QObject, например:

class B(QStatusBar, A): 
    def __init__(self, widget, parent=None): 
     QStatusBar.__init__(self, parent=parent, wiget=widget) 
     A.__init__(self, widget) 

    def handler(self): 
     self.show('Destroyed', 3000) 

Обратите внимание на widget=widget в конструкторе QStatus Bar: если мы не укажем его, вы получите TypeError ...

+0

У меня есть немного другой случай, и это похоже на некоторую проблему с QtObjects, проглатывающим аргументы всех классов sibling при использовании множественного наследования. EDIT: это, по-видимому, предназначено: http://pyqt.sourceforge.net/Docs/PyQt5/multiinheritance.html – krassowski

Смежные вопросы