我正在寻找Python专用文档或更好的Python示例代码片段,其中显示了如何使用QSignalBlocker。将不胜感激。
[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_())
可以使用QObject的blockSignals()方法完成相同的逻辑:
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)
以上方法有效,但是我目前正在使用一种也可以起作用的替代机制:
self.blockSignals(True)
self.field.clear()
self.blockSignals(False)