我通过在Python中继承如下(使用Python-Qt绑定)创建了一个可点击的QWidget
:
class ClickableWidget(QtGui.QWidget):
clicked = QtCore.Signal(QtGui.QMouseEvent)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def mousePressEvent(self, event):
self.clicked.emit(event)
当然可以实施更多事件和更多信号。
我想将相同的功能添加到QLabel
,QToolBar
,..这当然可以通过相同的方式轻松完成,从而导致大量代码重复。
是否存在更好的替代方案,即代码重复最少且代码高效且易于维护?什么是最像Qt / Pythonic的方式?
一种替代方法可能是在Qt应用程序(?)上安装一个事件过滤器,以过滤进入任何所需小部件的所有事件,但这可能会因为必须区分目标对象而变得复杂。
答案 0 :(得分:1)
您可以创建一个定义子类的函数
def createClickableSubclass(parent):
class ClickableSubclass(parent):
clicked_ = QtCore.Signal(QtGui.QMouseEvent)
def __init__(self, *args, **kwargs):
super(ClickableSubclass, self).__init__(*args, **kwargs)
def mousePressEvent(self, event):
self.clicked_.emit(event)
return ClickableSubclass
MyLabel = createClickableSubclass(QtGui.QLabel)
MyToolBar = createClickableSubclass(QtGui.QToolBar)
编辑:参考您的评论,您可以使用以下子类:
aLabel = MyLabel('Label text')
aLabel.setStyleSheet('color: yellow')