PyQt Widget connect()和disconnect()

alp*_*ric 18 python pyqt click signals-slots disconnect

根据条件,我想将按钮连接/重新连接到不同的功能.

假设我有一个按钮:

myButton = QtGui.QPushButton()
Run Code Online (Sandbox Code Playgroud)

对于这个例子,假设我检查是否有互联网连接.

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

elif connected == False:
    myButton.clicked.connect(function_B)
Run Code Online (Sandbox Code Playgroud)

首先,我想在重新分配/重新连接到另一个功能(function_A或function_B)之前断开按钮与已连接的任何功能的连接.其次,我已经注意到重新连接按钮后,需要额外点击按钮才能获得新功能.按钮重新连接到另一个功能后,它仍然会尝试运行上一个功能 - 一个按钮之前连接的功能(重新连接之前).请指教.提前致谢!

稍后编辑:

看起来小部件的.disconnect()方法可用于断开按钮与其连接的功能的连接.

myButton.disconnect()
Run Code Online (Sandbox Code Playgroud)

不幸的是.如果小部件没有连接到任何功能,.disconnect()会抛出错误.为了解决这个问题,我使用了Try/Except.但我宁愿使用更优雅的解决方案......

try: myButton.clicked.disconnect() 
except Exception: pass
Run Code Online (Sandbox Code Playgroud)

ekh*_*oro 21

如果您需要在许多地方重新连接信号,那么您可以定义一个通用的实用程序函数,如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

(注意:需要使用循环来安全地断开特定处理程序,因为它可能已连接多次,并且一次disconnect只删除一个连接.).

  • @K.Mulier 这就是[文档所说的](https://www.riverbankcomputing.com/static/Docs/PyQt5/signals_slots.html#disconnect),所以如果您看到不同的行为,这将是一个错误。通过检查“sender.receivers(sender.signal)”的输出来测试这一点很容易。 (2认同)

Alv*_*tes 6

试试这个:

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_()
Run Code Online (Sandbox Code Playgroud)