python - 如何临时断开pyqt QSignalMapper

标签 python python-3.x pyqt pyqt5

我有一个 QSignalMapper,有时我需要断开这个 QSignalMapper 与插槽的连接,然后再次重新连接。 执行此操作的正确方法是什么?

或者有什么方法可以检查QSignalMapper是否连接到任何插槽?

最佳答案

一种简单的解决方案是使用blockSignals()来阻止信号的发射,而不是连接和断开插槽。方法。

from PyQt5 import QtCore, QtWidgets


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        self._mapper = QtCore.QSignalMapper(self)
        vlay = QtWidgets.QVBoxLayout(self)
        checkbox = QtWidgets.QCheckBox("Block Signals")
        checkbox.stateChanged.connect(self.onStateChanged)
        vlay.addWidget(checkbox)
        for i in range(5):
            button = QtWidgets.QPushButton("{}".format(i))
            button.clicked.connect(self._mapper.map)
            self._mapper.setMapping(button, "button-{}".format(i))
            vlay.addWidget(button)
        self._mapper.mapped[str].connect(self.onClicked)

    @QtCore.pyqtSlot(int)
    def onStateChanged(self, state):
        self._mapper.blockSignals(state == QtCore.Qt.Checked)

    @QtCore.pyqtSlot(str)
    def onClicked(self, text):
        print(text)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

另一方面,QSignalMapper 从 Qt 5.10 开始已弃用,因此将来它将被淘汰。

关于python - 如何临时断开pyqt QSignalMapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54155407/

相关文章:

python - 如何将bert的embedding向量与其他特征结合起来?

python - PySide:将标准输出重定向到对话框

python - 在 PyQt5 中的 QTreeWidget 和 QListWidget 之间拖动项目?

python - ipython并行和非复制发送numpy数组

python - 将 Kerberos 身份验证与 Paramiko 结合使用

python - 在 Python 中将 DNA 序列翻译成氨基酸

python - NLTK WordNetLemmatizer 中的多线程?

python - 枕头,如何将文字放在图像的中心

python - 如何显示 PyQt 模式对话框并在关闭后从其控件中获取数据?

Python有限差分函数?