1

我在 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似乎没有将方法与按钮连接起来。这可以很容易地解决吗?

4

1 回答 1

5

connectSlotsByName从注册的插槽Slot工作,并从__name__给定的函数中工作。

定义时的名称on_myButton_clicked'on_myButton_clicked'。但是,然后您将其传递给装饰器;装饰器函数返回一个名为'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;这将使调试某些情况更容易。

于 2012-05-07T12:04:13.713 回答