2014-10-31 3 views
-1

Я изучаю PyQt5, и я попытался создать расширенные виджеты. Я также изучаю ООП, поэтому мне не хватает опыта для этого проекта.Как реорганизовать эти базовые классы (PyQt5)

Моя конечная цель состоит в том, чтобы иметь главные виджеты, которые могут отключать/включать некоторые подчиненные виджеты. До сих пор мне нужны проверки и переключатели.

Так что я попытался создать абстрактный класс, который содержит расширенное поведение виджетов (управление состояния виджетов ведомых):

class QDisablingWidget(): 
    __metaclass__ = ABCMeta 
    def __init__(self): 
     self.slaveWidgets = [] 
     self.slaveStateWhenMasterIsEnabled = {} 

    def addSlaveWidget(self, slaveWidget, isEnabledWhenMasterIsEnabled=True): 
     [...] 
    def updateSlaveStatus(self): 
     [...] 

Затем я создаю свои расширенные классы виджетов:

class QDisablingCheckBox(QtWidgets.QCheckBox, QDisablingWidget): 
    def __init__(self, text=None, parent=None, isInMutexGroup=False): 
     super(QtWidgets.QCheckBox, self).__init__() 
     super(QDisablingWidget, self).__init__() 
     if text: 
      self.setText(text) 
     if parent: 
      self.setParent(parent) 
     self.isInMutexGroup = isInMutexGroup 

     # Click signal handling 
     self.stateChanged.connect(self.updateSlaveStatus) 


class QDisablingRadioButton(QtWidgets.QRadioButton, QDisablingWidget): 
    def __init__(self, text=None, parent=None, isInMutexGroup=False): 
     super(QtWidgets.QRadioButton, self).__init__() 
     super(QDisablingWidget, self).__init__() 
     if text: 
      self.setText(text) 
     if parent: 
      self.setParent(parent) 
     self.isInMutexGroup = isInMutexGroup 

     # Click signal handling 
     self.toggled.connect(self.updateSlaveStatus) 

Вы уже можете увидеть проблему: Мне нужно подключить мой self.updateSlaveStatus так я добавил его в конструкторе выводит правильные сигналы (stateChanged и toggled) d классов. Недавно я также добавил isInMutexGroup аргумент по ряду причин реализации, и я понимаю, что я повторение кода в обеих производных классов ...

Это первый раз, когда я пытаюсь использовать ООП «для реальной» (первой попытки множественное наследование и абстрактный класс), поэтому, даже если я знаю, что нарушаю красоту концепции ООП, я не знаю, что делать, чтобы получить хорошую иерархию классов ...

Так что, в основном, я ищу решение на этом примере. Но я также ищу рекомендации, общие советы, учебные пособия и т. Д. На самом деле все, что могло мне помочь!

Благодарим за помощь.

ответ

0

Даже если бы я получил downvote на этот вопрос, я думаю, что некоторые новички могли бы быть заинтересованы решением я нашел:

У меня есть расширение абстрактный класс так:

class QDisablingWidget(QtCore.QObject): 
    __metaclass__ = ABCMeta 
    def __init__(self, isInMutexGroup=False, **kwds): 
     [...] 

Тогда я могу Выведите класс так:

class QDisablingCheckBox(QtWidgets.QCheckBox, QDisablingWidget): 
    def __init__(self, **kwds): 
     super().__init__(**kwds) 
     # On click signal handling 
     self.stateChanged.connect(self.updateSlaveStatus) 

и

class QDisablingRadioButton(QtWidgets.QRadioButton, QDisablingWidget): 
    def __init__(self, **kwds): 
     super().__init__(**kwds) 
     # On click signal handling 
     self.toggled.connect(self.updateSlaveStatus) 

Наконец, когда я использую классы мне нужно создать объект так:

disablingRadioBut = QWidgets.QDisablingRadioButton(text="My button", 
                parent=self, 
                isInMutexGroup=True) 

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

Я получил это решение здесь: http://pyqt.sourceforge.net/Docs/PyQt5/multiinheritance.html

И более подробно здесь: http://rhettinger.wordpress.com/2011/05/26/super-considered-super/

Очень хорошая статья!

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