【问题标题】:How to set value of a widget without triggering valueChanged callback in PySide?如何在不触发 PySide 中的 valueChanged 回调的情况下设置小部件的值?
【发布时间】: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


【解决方案1】:

我认为如果你使用块信号,那应该没问题。

def handle_WeightMessage(self, msg):
    self.ui.horizontalSlider.blockSignals(True)
    self.ui.horizontalSlider.setValue(msg["val"])
    self.ui.horizontalSlider.blockSignals(False)

【讨论】:

  • 不应该在您设置值的 UI 对象上调用 blockSignals()(而不仅仅是 self)?
  • 抱歉,我没注意到
  • 我确实试过这个before。结果几乎与预期一样,除了此方法还阻止了我不想阻止的 Qt Designer 中定义的信号。例如。如果在 Qt Designer 中将滑块连接到进度条并说“当滑块的值更改时,设置进度条的值”,然后在更新 slider 的值之前 slider.blockSignals,则滑块的值会更新,但进度条的值不会更新。这就是为什么在这种情况下,断开和连接信号更为合适。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 2021-05-11
  • 2017-08-22
  • 1970-01-01
  • 2011-10-15
相关资源
最近更新 更多