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
似乎没有将方法与按钮连接。这可以很容易修复吗?
答案 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
是一个好习惯;它会使调试更容易。