如何重构这些基本类(PyQt5)

时间:2014-10-31 15:32:25

标签: python oop pyqt refactoring

我正在学习PyQt5,我试图创建一个扩展的小部件。 我也在学习OOP,所以我缺乏这个项目的经验。

我的最终目标是拥有可以禁用/启用某些从属小部件的主小部件。 到目前为止,我需要检查和单选按钮。

所以我尝试创建一个抽象类,其中包含小部件的扩展行为(从属小部件状态的管理):

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连接到正确的信号(stateChangedtoggled),因此我将其添加到派生类的构造函数中。 最近我还出于某些实现原因添加了isInMutexGroup参数,我意识到我在两个派生类中复制代码......

这是我第一次尝试使用OOP“for real”(多次继承和抽象类的第一次尝试),所以即使我知道我打破了OOP概念的美,我也不知道该怎么做做一个很好的类层次结构......

基本上,我正在寻找这个例子的解决方案。但我也在寻找指导方针,一般建议,教程等。实际上任何可以帮助我的东西!

感谢您的帮助。

1 个答案:

答案 0 :(得分: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)

即我必须明确地使用关键字,以便每个构造函数都会使用使用/知道的关键字。 由于这种方法,我的扩展类具有最大的可重用性。

我在这里得到了这个解决方案: http://pyqt.sourceforge.net/Docs/PyQt5/multiinheritance.html

此处有更多细节: http://rhettinger.wordpress.com/2011/05/26/super-considered-super/

非常好的文章!