Прежде всего, в Qt doc. Есть хорошее введение:
, которые я настоятельно рекомендую прочитать.
Где-то посередине вы найдете следующий абзац:
По умолчанию для каждого соединения выдается сигнал;два сигнала испускаются для дублированных соединений.Вы можете разорвать все эти соединения с помощью одного disconnect () вызова.Если вы передадите тип Qt :: UniqueConnection , соединение будет установлено, только если оно не является дубликатом.Если уже есть дубликат (точно такой же сигнал в тот же слот на тех же объектах), соединение не будет установлено, и соединение вернет false
.
Я должен признать, я не знало сингле disconnect()
.Обычно я сохраняю соединение для обработчика сигнала, которое возвращается connect()
, когда я собираюсь отключить его позже.Кроме того, Qt позволяет также отключать обработчик теми же аргументами, которые были приведены в connect()
, но я никогда не использовал это.
Вот мой маленький пример Python для возни:
#!/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_())
Обработчики сигналов onBtn1Clicked()
и onBtn1ClickedAgain()
соединяют друг друга взаимоисключающими.
Протестировано в cygwin64 в Windows 10:
$ /usr/bin/python3 --version
Python 3.6.4
$ ./testQPushButton.py
onBtn1Clicked
onBtn1ClickedAgain
onBtn1Clicked
onBtn1ClickedAgain
Что касается множественных вызовов обработчика сигналов, я рекомендую следующее: закомментируйте строку qBtn1.clicked.disconnect()
в обоих обработчиках и посмотрите, что происходит (на консоли).