【问题标题】:How to temporary disconnect a pyqt QSignalMapper如何临时断开 pyqt QSignalMapper
【发布时间】:2019-01-11 23:35:40
【问题描述】:

我有一个QSignalMapper,有时我需要将这个QSignalMapper 断开连接到一个插槽,然后重新连接。 这样做的正确方法是什么?

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

【问题讨论】:

    标签: python python-3.x pyqt pyqt5


    【解决方案1】:

    一种简单的解决方案是使用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 中弃用,因此将来将被淘汰。

    【讨论】:

    • 非常感谢。我还有1个问题。 PyQt 中没有弃用的 QSignalMapper 有什么好的替代方案?
    猜你喜欢
    • 2011-04-23
    • 2018-12-29
    • 2015-04-15
    • 2013-07-14
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    相关资源
    最近更新 更多