1

PySide を使用した Python のメイン ウィンドウ クラスには、次のような多くのメンバー関数があります。

@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 に答える