2012-05-07 24 views
1

在Python我的主窗口类PySide有很多成员的功能,如: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

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;它会使调试更容易些。

+0

它工作完美。谢谢! – Petter