如何在Python中使用QSignalBlocker?

问题描述 投票:1回答:2

我正在寻找Python专用文档或更好的Python示例代码片段,其中显示了如何使用QSignalBlocker。将不胜感激。

python pyqt pyqt5 signals
2个回答
2
投票

[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)

0
投票

以上方法有效,但是我目前正在使用一种也可以起作用的替代机制:

  self.blockSignals(True)
  self.field.clear()
  self.blockSignals(False)
© www.soinside.com 2019 - 2024. All rights reserved.