<p>首先是介绍</p>
<h2><a href="http://doc.qt.io/qt-5/signalsandslots.html" rel="nofollow noreferrer">Signals & Slots</a></h2>
<p>我强烈建议你读。在</p>
<p>在中间的某个地方,你会发现以下段落:</p>
<blockquote>
<p>By default, for every connection you make, a signal is emitted; two signals are emitted for duplicate connections. You can break all of these connections with a single <a href="http://doc.qt.io/qt-5/qobject.html#disconnect" rel="nofollow noreferrer">disconnect()</a> call. If you pass the <a href="http://doc.qt.io/qt-5/qt.html#ConnectionType-enum" rel="nofollow noreferrer">Qt::UniqueConnection</a> type, the connection will only be made if it is not a duplicate. If there is already a duplicate (exact same signal to the exact same slot on the same objects), the connection will fail and connect will return <code>false</code>.</p>
</blockquote>
<p>我必须承认,我不知道单曲<code>disconnect()</code>。通常,我存储信号处理程序的连接,当我打算以后断开连接时,<code>connect()</code>会返回这个连接。此外,Qt还允许通过<code>connect()</code>中给出的相同参数断开处理程序,但我从未使用过这种方法。在</p>
<p>这里是我的小Python摆弄示例:</p>
<pre><code>#!/usr/bin/python3
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton
app = QApplication(sys.argv)
qBtn1 = QPushButton("Click me")
qBtn1.show()
def onBtn1Clicked():
print("onBtn1Clicked")
qBtn1.clicked.disconnect()
qBtn1.setText("Click me again")
qBtn1.clicked.connect(onBtn1ClickedAgain)
def onBtn1ClickedAgain():
print("onBtn1ClickedAgain")
qBtn1.clicked.disconnect()
qBtn1.setText("Click me")
qBtn1.clicked.connect(onBtn1Clicked)
qBtn1.clicked.connect(onBtn1Clicked)
sys.exit(app.exec_())
</code></pre>
<p>信号处理程序<code>onBtn1Clicked()</code>和{<cd5>}互相连接,互斥。在</p>
<p>在Windows 10上的<a href="http://www.cygwin.org" rel="nofollow noreferrer">cygwin64</a>中测试:</p>
^{pr2}$
<p><a href="https://i.stack.imgur.com/q8IO6.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/q8IO6.png" alt="Snapshot of testQPushButton.py"/></a><a href="https://i.stack.imgur.com/Z8h8S.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/Z8h8S.png" alt="Snapshot of testQPushButton.py after clicking button"/></a></p>
<p>关于一个信号处理程序的多个调用,我建议如下:注释两个处理程序中的<code>qBtn1.clicked.disconnect()</code>行并查看发生了什么(在控制台上)。在</p>