为QWidget和派生类实现事件处理程序并避免代码重复

时间:2014-07-10 13:31:13

标签: python qt events pyside qwidget

我通过在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)

当然可以实施更多事件和更多信号。

我想将相同的功能添加到QLabelQToolBar,..这当然可以通过相同的方式轻松完成,从而导致大量代码重复。

是否存在更好的替代方案,即代码重复最少且代码高效且易于维护?什么是最像Qt / Pythonic的方式?

一种替代方法可能是在Qt应用程序(?)上安装一个事件过滤器,以过滤进入任何所需小部件的所有事件,但这可能会因为必须区分目标对象而变得复杂。

1 个答案:

答案 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')