1
def connect(signal):
    def result(func):
        signal.connect(func)
        return func
    return inner

def safemode(msg):
    def inner(func):
        @wraps(func):
        def result(*args, **kwargs):
            print 'Args passed to func:', args, kwargs
            try:
                func(*args, **kwargs)
            except:
                print msg
        return result
    return inner

@connect(form.my_action.triggered)
@safemode('Something bad'?)
def my_action():
    print 'Something good!'

したがって、アクションをトリガーすると、次のように表示されます。

Args passed to func: (False,) {}
Something bad?

my_action引数を取らないため、where is の呼び出しはfunc(*args, **kwargs)失敗funcmy_actionます。

1 つの解決策は単に削除すること*args, **kwargsですが、Qt GUI 関数と非 GUI 関数の両方に同じデコレータを使用したいと思います。

スタック トレースはあまり役に立ちません。app.exec_()障害が発生した行が表示されるだけです。

それはどこFalseから来て、どうすれば修正できますか?

4

1 に答える 1

2

デフォルト値を渡すパラメータを持つ一般的に使用されるシグナルが多数あります。これにはQAction.triggeredQAbstractButton.clickedが含まれます。

事実上、PyQt に関する限り、これらのシグナルには 2 つのオーバーロードがあります。1 つはデフォルト値を渡すもので、もう 1 つは渡さないものです。PyQt には、使用するものを明示的に選択するメカニズムがありますが、使用されていない場合は、ハードコードされたデフォルトにフォールバックします。上記の 2 つのシグナルの場合、デフォルトのオーバーロードは、デフォルト値を渡すものです。

値を渡さないオーバーロードを選択するには、次のようにします。

form.my_action.triggered[()]

(注意: シグナル オブジェクトのgetitem構文は、通常、type、またはtypesのタプルを取るため、パラメーターを持たないオーバーロードを明示的に選択するには、空のタプルが必要です)。

于 2013-10-31T18:53:06.053 に答える