如何在不触发PySide中的valueChanged回调的情况下设置窗口小部件的值?

cer*_*cem 6 signals-slots pyside

我想更新小部件的值,但为了防止无限循环,我需要阻止调用此小部件.valueChanged信号的回调函数.

以下示例完全按预期工作:

Qt = PySide

class MainWindow(Actor, Qt.QtGui.QMainWindow):
    def __init__(self):
        Qt.QtGui.QMainWindow.__init__(self)
        Actor.__init__(self)
        self.ui = Qt.loadUI('simulator.ui')
        self.ui.horizontalSlider.valueChanged.connect(self.emit_weight_msg)

    def emit_weight_msg(self, value):
        self.send({'WeightMessage': {'val': value}})

    def handle_WeightMessage(self, msg):
        self.ui.horizontalSlider.valueChanged.disconnect(self.emit_weight_msg)
        self.ui.horizontalSlider.setValue(msg["val"])
        self.ui.horizontalSlider.valueChanged.connect(self.emit_weight_msg)
Run Code Online (Sandbox Code Playgroud)

由于断开和连接valueChanged信号似乎有点像黑客,我想问是否存在更优雅的解决方案.

完整代码在这里:https://github.com/ceremcem/weighing-machine-testing

编辑

我正在寻找一种方法,比如:

def setValueSilent(QtObject, value):
    tmp_callback = QtObject.get_callback_functions_that_are_set_in_python_code()
    QtObject.valueChanged.disconnect(tmp_callback)
    QtObject.setValue(value)
    QtObject.valueChanged.connect(tmp_callback)
Run Code Online (Sandbox Code Playgroud)

Ach*_*yan 11

我想如果你使用blocksignals那么它应该没问题.

def handle_WeightMessage(self, msg):
    self.ui.horizontalSlider.blockSignals(True)
    self.ui.horizontalSlider.setValue(msg["val"])
    self.ui.horizontalSlider.blockSignals(False)
Run Code Online (Sandbox Code Playgroud)