Как использовать QSignalBlocker в Python? - PullRequest
1 голос
/ 25 февраля 2020

Я ищу либо документацию Python -specifi c, либо - еще лучше - образец кода Python, который показывает, как использовать QSignalBlocker. Буду благодарен за все.

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Класс 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)
0 голосов
/ 25 февраля 2020

Выше работает, но я в настоящее время использую альтернативный механизм, который также работает:

  self.blockSignals(True)
  self.field.clear()
  self.blockSignals(False)
...