PyQt Widget 连接()和断开连接()

问题描述 投票:0回答:4

根据情况,我想将按钮连接/重新连接到不同的功能。

假设我有一个按钮:

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
python pyqt click signals-slots disconnect
4个回答
35
投票

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

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)
一次仅删除一个连接。)。


11
投票

试试这个:

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
投票

3.4+ 使用 contextlib.suppress 的简洁方法:

with contextlib.suppress(RuntimeError):
    button.clicked.disconnect()
button.connect(func_a if condition else func_b)

0
投票

尝试这样:

button.doubleClicked.connect(my_function)

检查按钮是否已连接,如果是则断开连接:

如果按钮.doubledClicked.connect(my_function): 按钮.doubledClicked.disconnect()

© www.soinside.com 2019 - 2024. All rights reserved.