Класс QSignalBlocker имеет простое поведение: когда для него задан QObject, передача сигналов из QObject блокируется, с помощью метода unblock()
блок удаляется, а с reblock()
он снова блокируется.
В следующем примере, если радиокнопка не проверена, то каждый раз, когда элемент выбирается из QComboBox, он передает выбранный текст в QLabel через сигналы, если радиокнопка проверяется, то сигналы не будут излучаться, поэтому QLabel не будет отображать текст, выбранный QComboBox:
from PyQt5 import QtCore, QtGui, QtWidgets
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
radiobutton = QtWidgets.QRadioButton("block/unblock")
self.m_label = QtWidgets.QLabel()
self.m_combobox = QtWidgets.QComboBox()
self.m_combobox.addItems(
[
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday",
]
)
lay = QtWidgets.QVBoxLayout(self)
lay.addWidget(radiobutton)
lay.addWidget(self.m_label)
lay.addWidget(self.m_combobox)
self.m_blocker = QtCore.QSignalBlocker(self.m_combobox)
self.m_blocker.unblock()
self.m_combobox.currentTextChanged.connect(self.m_label.setText)
radiobutton.toggled.connect(self.on_toggled)
@QtCore.pyqtSlot(bool)
def on_toggled(self, state):
if state:
self.m_blocker.reblock()
else:
self.m_blocker.unblock()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
Те же логи c можно сделать с помощью метода blockSignals () объекта QObject:
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
radiobutton = QtWidgets.QRadioButton("block/unblock")
self.m_label = QtWidgets.QLabel()
self.m_combobox = QtWidgets.QComboBox()
self.m_combobox.addItems(
[
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday",
]
)
lay = QtWidgets.QVBoxLayout(self)
lay.addWidget(radiobutton)
lay.addWidget(self.m_label)
lay.addWidget(self.m_combobox)
radiobutton.toggled.connect(self.m_combobox.blockSignals)
self.m_combobox.currentTextChanged.connect(self.m_label.setText)