PySide:小部件插槽的多个装饰器

时间:2012-05-07 11:49:46

标签: python qt pyside

Python中使用PySide的主窗口类有很多成员函数,如:

@QtCore.Slot()
def on_myButton_clicked(self) :
    ...

我想添加自己的装饰器,但以下不起作用:'

def my_decorator(f) :
    def wrapper(*args, **kwargs) :
            f(*args, **kwargs)  
    return wrapper

...

@QtCore.Slot()
@my_decorator
def on_myButton_clicked(self) :
    ...

当我这样做时,QtCore.QMetaObject.connectSlotsByName似乎没有将方法与按钮连接。这可以很容易修复吗?

1 个答案:

答案 0 :(得分:4)

connectSlotsByName来自已注册的广告位,而Slot则来自所提供函数的__name__

on_myButton_clicked的名称定义为'on_myButton_clicked'。但是,然后你将它传递给装饰者; decorator函数返回一个名为'wrapper'的函数。因此,Slot会使用该名称注册,不是 'on_myButton_clicked'

要解决此问题,请使用functools.wraps

def my_decorator(f):
    @functools.wraps(f)
    def wrapper(*args, **kwargs):
        f(*args, **kwargs)
    return wrapper

除此之外,还要对__name__进行排序,以便使用正确的名称注册广告位。

始终使用functools.wraps是一个好习惯;它会使调试更容易。