根据情况,我想将按钮连接/重新连接到其他功能。
假设我有一个按钮:
myButton = QtGui.QPushButton()
对于此示例,假设我检查是否存在互联网连接。
if connected == True:
myButton.clicked.connect(function_A)
elif connected == False:
myButton.clicked.connect(function_B)
首先,在将按钮重新分配/重新连接到另一个功能(function_A或function_B)之前,我想将其从已连接的任何功能中断开。
其次,我已经注意到,重新连接按钮后,需要额外点击一下按钮才能使用新功能。将按钮重新连接到另一个功能后,它仍然尝试运行先前的功能-较早地(在重新连接之前)将按钮连接到的功能。请指教。提前致谢!
编辑后:
似乎是小部件的 .disconnect()方法可用于将按钮与其所连接的功能断开连接。
myButton.disconnect()
不幸的是,如果窗口小部件未连接到任何函数,.disconnect()会引发错误。
为了解决这个问题,我使用了Try/Except。但是我宁愿使用更优雅的解决方案...
try: myButton.clicked.disconnect()
except Exception: pass
最佳答案
如果您需要在许多地方重新连接信号,则可以定义一个通用实用程序函数,如下所示:
def reconnect(signal, newhandler=None, oldhandler=None):
try:
if oldhandler is not None:
while True:
signal.disconnect(oldhandler)
else:
signal.disconnect()
except TypeError:
pass
if newhandler is not None:
signal.connect(newhandler)
...
if connected:
reconnect(myButton.clicked, function_A)
else:
reconnect(myButton.clicked, function_B)
(注意:该循环对于安全断开特定处理程序是必需的,因为它可能已经连接了很多次,并且disconnect(slot)
一次仅删除一个连接。)