【发布时间】:2016-05-01 15:27:27
【问题描述】:
我想更新一个小部件的值,但为了防止无限循环,我需要阻止调用这个小部件的.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)
由于断开和连接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)
【问题讨论】:
-
也许会改变你的设计,并根据触发消息的原因有不同的处理方法?还是不同的消息?
-
我看不出这将如何防止误触发...
标签: pyside signals-slots