2013-10-31 41 views
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!' 

所以,當我觸發動作,我看到:的Qt傳遞一個不需要爭論的插槽

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

由於my_action不帶任何參數,調用func(*args, **kwargs)其中funcmy_action失敗。

我知道一個解決方案是隻刪除*args, **kwargs,但我想使用相同的裝飾器,用於Qt GUI功能和非GUI功能。

堆棧跟蹤不是很有幫助;它只是顯示app.exec_(),然後是發生故障的線路。

False從哪裏來,我該如何解決?

+0

不太確定python部分,但我認爲它是'triggered(bool)'的布爾參數,請參閱http://qt-project.org/doc/qt-5.1/qtwidgets/qaction.html #triggered –

回答

2

有許多通常使用的信號,其參數通過默認值。這包括QAction.triggeredQAbstractButton.clicked。這些信號在PyQt中有兩個重載:一個是傳遞默認值,另一個是不傳遞的。 PyQt有明確選擇使用哪一個的機制 - 但是如果它沒有被使用,它將回退到一個硬編碼的默認值。對於上述兩個信號,默認超載是確實通過默認值的那個。

要選擇哪個過載傳遞值,這樣做:

form.my_action.triggered[()] 

(NB:信號對象的的GetItem語法通常需要類型,或元組的類型,所以需要一個空元組來顯式選擇一個沒有參數的過載)。