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