将 QSlider 或 QDial 同步到 QDoubleSpinBox 的一个问题是,当 QDoubleSpinBox 更新 QDial 或 QSlider 时,将触发 QDial 或 QSlider valueChanged 信号,从而导致它们更新 QDoubleSpinBox 作为回报。这会导致您无法在 QDoubleSpinBox 中输入小数值的问题,因为当您输入小数“.”时,QDial/Slider 更新会覆盖小数,从而阻止您输入其余的小数。
要解决此问题,请让每个输入小部件检查它们的值是否已经与它们正在写入的小部件中的值匹配,如果匹配,则不要更新该值。下面是一个允许 QDial 和 QDoubleSpinBox 相互更新的函数示例:
def syncDialAndSpinbox(self, widget_in, widget_out):
if isinstance(widget_in, QtWidgets.QDial):
value = float(widget_in.value())*100.0/float(widget_in.maximum())
out_value = widget_out.value()
else:
value = round(widget_in.value()*widget_out.maximum()/100)
out_value = widget_out.value()
if value != out_value:
widget_out.setValue(value)
在此示例中,QDoubleSpinBox 是一个百分比 (0.0-100.0),而 QDial 有 100,000 步以支持将百分比的浮点输出到小数点后三位(0.000% 到 100.000%)。