我正在学习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
连接到正确的信号(stateChanged
和toggled
),因此我将其添加到派生类的构造函数中。
最近我还出于某些实现原因添加了isInMutexGroup
参数,我意识到我在两个派生类中复制代码......
这是我第一次尝试使用OOP“for real”(多次继承和抽象类的第一次尝试),所以即使我知道我打破了OOP概念的美,我也不知道该怎么做做一个很好的类层次结构......
基本上,我正在寻找这个例子的解决方案。但我也在寻找指导方针,一般建议,教程等。实际上任何可以帮助我的东西!
感谢您的帮助。
答案 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/
非常好的文章!