2014-02-05 243 views
12

根據條件我想連接/重新連接一個按鈕到不同的功能。PyQt Widget connect()和disconnect()

比方說,我有一個按鈕:

myButton = QtGui.QPushButton() 

對於這個例子,讓我們說,我檢查是否有互聯網連接。

if connected == True: 
    myButton.clicked.connect(function_A) 

elif connected == False: 
    myButton.clicked.connect(function_B) 

所有我想從它已經連接按鈕被重新分配/重新連接到另一個功能(function_A或function_B)之前的任何功能斷開的按鈕的第一。其次,我已經注意到,在按鈕重新連接之後,需要額外點擊按鈕來獲取新功能。在按鈕重新連接到另一個功能後,它仍然嘗試運行先前的功能 - 一個按鈕之前連接的功能(在重新連接之前)。請指教。提前致謝!

LATER EDITED:

似乎Widget的.disconnect()方法可以用來斷開按鈕從一個函數它它連接。

myButton.disconnect() 

不幸的是,如果一個小部件沒有連接到任何函數,那麼.disconnect()會拋出一個錯誤。 爲了解決它,我使用了Try/Except。但我寧願用更優雅的解決方案......

try: myButton.clicked.disconnect() 
except Exception: pass 
+0

引發的異常是什麼?有點奇怪。請注意,myButton.disconnect()與myButton.clicked.disconnect()不同,您實際上是指什麼? – Schollii

+0

@Schollii。它引發了一個'TypeError'。這個例外並不奇怪:事實上,這是非常可取的。它之所以被引入,是因爲舊式的連接和斷開信號的方法失敗了,這可能隱藏很多潛在的錯誤。總之,在更多的pythonic中引發異常。 – ekhumoro

+3

感謝您的解釋。我只是不明白爲什麼一個應該斷開所有信號的函數應該將「當前沒有連接」視爲異常行爲。 OTOH如果你嘗試斷開連接(someSignal)並且該信號不存在*,那麼我可以將它看作是應該被標記的例外情況。但是,anyhoo,它既不在這裏,也不在那裏,謝謝你的信息。 – Schollii

回答

13

如果您需要在很多地方重新連接信號,那麼你可以像這樣定義一個通用的效用函數:

def reconnect(signal, newhandler=None, oldhandler=None): 
    while True: 
     try: 
      if oldhandler is not None: 
       signal.disconnect(oldhandler) 
      else: 
       signal.disconnect() 
     except TypeError: 
      break 
    if newhandler is not None: 
     signal.connect(newhandler) 

... 

if connected: 
    reconnect(myButton.clicked, function_A) 
else: 
    reconnect(myButton.clicked, function_B) 

(NB:需要環路用於安全斷開特定的處理程序,因爲它可能已經連接multple次,disconnect只刪除在在一個連接我。)。

4

試試這個:

from PyQt4 import QtGui as gui 

app = gui.QApplication([]) 

myButton = gui.QPushButton() 

def function_A(): 
    myButton.clicked.disconnect() #this disconnect all! 
    myButton.clicked.connect(function_B) 
    print 'function_A' 

def function_B(): 
    myButton.clicked.disconnect(function_B) #this disconnect function_B 
    myButton.clicked.connect(function_A) 
    print 'function_B' 

myButton.clicked.connect(function_A) 
myButton.setText("Click me!") 
myButton.show() 

app.exec_() 
+0

你知道如何檢查一個小部件是否連接到一個函數?我發現有.isSignalConnected()小部件方法。不幸的是,我不知道如何使用它... – alphanumeric

+0

那麼你應該閱讀[this](http://qt-project.org/forums/viewthread/6820),我認爲沒有希望,但的確如果你找到一種方式讓我知道;) –