Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为QWidget和派生类实现事件处理程序并避免代码重复_Python_Qt_Events_Pyside_Qwidget - Fatal编程技术网

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

Python 为QWidget和派生类实现事件处理程序并避免代码重复,python,qt,events,pyside,qwidget,Python,Qt,Events,Pyside,Qwidget,我在Python中继承了一个可点击的QWidget,如下所示(使用Python Qt绑定): 当然,可以实施更多的事件和信号 我想将相同的功能添加到QLabel,QToolBar。。这当然可以很容易地完成,同样的方法会导致大量代码重复 在代码重复最少、代码高效且易于维护的意义上,是否有更好的替代方案?最像Qt/肾盂的方式是什么 另一种选择可能是在Qt应用程序(?)上安装事件过滤器,以过滤到任何所需窗口小部件的所有事件,但由于必须区分目标对象,这可能会变得复杂。您可以创建一个函数来定义子类 def

我在Python中继承了一个可点击的
QWidget
,如下所示(使用Python Qt绑定):

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

我想将相同的功能添加到
QLabel
QToolBar
。。这当然可以很容易地完成,同样的方法会导致大量代码重复

在代码重复最少、代码高效且易于维护的意义上,是否有更好的替代方案?最像Qt/肾盂的方式是什么


另一种选择可能是在Qt应用程序(?)上安装事件过滤器,以过滤到任何所需窗口小部件的所有事件,但由于必须区分目标对象,这可能会变得复杂。

您可以创建一个函数来定义子类

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

我的Python知识绝对不全面。可以在函数中定义类吗?创建的类的类型名是什么?例如,您将如何在样式表中指定它?是的,您也可以指定函数(装饰器就是这样工作的)。类的名称是您选择分配给它的任何名称,在我的示例中,这是
MyLabel
MyToolBar
。这些不是类的实例,而是类本身定义的句柄。不幸的是,它似乎被更了解它的人拒绝了。因此,也许您可以修复超级(父级,…),它给出了一个错误(或声明它是Python2.X),还请在样式表“.MyLabel{color:yellow}”中添加一个类选择器,再次显示类名为MyLabel。谢谢,我错过了这个。我现在已经编辑好了。
aLabel = MyLabel('Label text')
aLabel.setStyleSheet('color: yellow')