获取 QDoubleDoubleSpinBox 以显示 QSlider 的(转换后的)值并仍然使用 setTracking(False)
Getting a QDoubleDoubleSpinBox to display the (converted) value of a QSlider and still use setTracking(False)
我正在为我编写的动画工具创建 ui。 ui 由一个QDoubleSpinBox 和一个QSlider 组成。我已将 QSlider 连接到 QDoubleSpinBox,并具有转换其值的功能。我想使用滑块的 valueChange 更新旋转框。我还希望旋转框的 editingFinished() 更新滑块手柄的位置。我有这个连接工作。
该工具有两种模式; "interactive" 和 "non-interactive"。 Interactive 调用我的动画工具的主函数 随着滑块的移动 ,旋转框 s/slider 的值作为参数。非交互模式旨在仅在释放滑块时调用我的工具的功能。看起来滑块上的 setTracking() 就是答案,但当然它打破了旋转框始终显示滑块值的行为。
有没有办法让旋转框与滑块的值保持联系,并且仍然在滑块上使用 setTracking(False)?还有另一种方法可以实现我正在寻找的行为吗?我正在使用 Python 和 Pyside。
# jumping to relevant code
self.spinbox = QtGui.QDoubleSpinBox()
self.spinbox.setRange(0.0, 1.0)
self.spinbox.setDecimals(3)
self.sld = QtGui.QSlider()
self.sld.setRange(0, 1000)
self.sld.valueChanged[int].connect(self.update_spinbox)
self.spinbox.editingFinished.connect(self.update_slider_position)
def update_spinbox(self, value):
self.spinbox.setValue(float(value)/1000)
def update_slider_position(self):
self.sld.setSliderPosition(self.spinbox.value()*1000)
ui 中的菜单切换滑块的 setTracking()。
它可能没有你想要的那么优雅和简单,但它应该是你追求的行为。
from PySide import QtGui
class Window(QtGui.QWidget):
def __init__(self, parent = None):
super(Window, self).__init__(parent)
self.updateFromSpinbox = False # Used so it slider doesn't run function twice
self.spinbox = QtGui.QDoubleSpinBox()
self.spinbox.setRange(0.0, 1.0)
self.spinbox.setDecimals(3)
self.spinbox.setSingleStep(0.1)
self.sld = QtGui.QSlider()
self.sld.setRange(0, 1000)
self.checkButton = QtGui.QPushButton('Set interactive mode')
self.checkButton.setCheckable(True)
self.sld.valueChanged[int].connect(self.update_spinbox)
self.sld.sliderReleased.connect(self.slider_released)
self.spinbox.editingFinished.connect(self.update_slider_position)
mainLayout = QtGui.QVBoxLayout()
mainLayout.addWidget(self.spinbox)
mainLayout.addWidget(self.sld)
mainLayout.addWidget(self.checkButton)
self.setLayout(mainLayout)
self.resize(200, 200)
self.show()
# Runs when interactive mode is disabled
def slider_released(self):
if not self.checkButton.isChecked():
self.myFunction()
def update_spinbox(self, value):
if not self.updateFromSpinbox:
self.spinbox.setValue(float(value)/1000)
if self.checkButton.isChecked():
self.myFunction()
def update_slider_position(self):
self.updateFromSpinbox = True
self.sld.setSliderPosition(self.spinbox.value()*1000)
self.updateFromSpinbox = False
self.myFunction()
# Main function to run when value updates
def myFunction(self):
print self.sld.value()
win = Window()
当您选中进入交互模式的按钮时,myFunction()
将在滑块移动和旋转框完成编辑时调用。如果它被选中以退出交互模式,myFunction()
只会在滑块被释放并且旋转框完成编辑时被调用。
我正在为我编写的动画工具创建 ui。 ui 由一个QDoubleSpinBox 和一个QSlider 组成。我已将 QSlider 连接到 QDoubleSpinBox,并具有转换其值的功能。我想使用滑块的 valueChange 更新旋转框。我还希望旋转框的 editingFinished() 更新滑块手柄的位置。我有这个连接工作。
该工具有两种模式; "interactive" 和 "non-interactive"。 Interactive 调用我的动画工具的主函数 随着滑块的移动 ,旋转框 s/slider 的值作为参数。非交互模式旨在仅在释放滑块时调用我的工具的功能。看起来滑块上的 setTracking() 就是答案,但当然它打破了旋转框始终显示滑块值的行为。
有没有办法让旋转框与滑块的值保持联系,并且仍然在滑块上使用 setTracking(False)?还有另一种方法可以实现我正在寻找的行为吗?我正在使用 Python 和 Pyside。
# jumping to relevant code
self.spinbox = QtGui.QDoubleSpinBox()
self.spinbox.setRange(0.0, 1.0)
self.spinbox.setDecimals(3)
self.sld = QtGui.QSlider()
self.sld.setRange(0, 1000)
self.sld.valueChanged[int].connect(self.update_spinbox)
self.spinbox.editingFinished.connect(self.update_slider_position)
def update_spinbox(self, value):
self.spinbox.setValue(float(value)/1000)
def update_slider_position(self):
self.sld.setSliderPosition(self.spinbox.value()*1000)
ui 中的菜单切换滑块的 setTracking()。
它可能没有你想要的那么优雅和简单,但它应该是你追求的行为。
from PySide import QtGui
class Window(QtGui.QWidget):
def __init__(self, parent = None):
super(Window, self).__init__(parent)
self.updateFromSpinbox = False # Used so it slider doesn't run function twice
self.spinbox = QtGui.QDoubleSpinBox()
self.spinbox.setRange(0.0, 1.0)
self.spinbox.setDecimals(3)
self.spinbox.setSingleStep(0.1)
self.sld = QtGui.QSlider()
self.sld.setRange(0, 1000)
self.checkButton = QtGui.QPushButton('Set interactive mode')
self.checkButton.setCheckable(True)
self.sld.valueChanged[int].connect(self.update_spinbox)
self.sld.sliderReleased.connect(self.slider_released)
self.spinbox.editingFinished.connect(self.update_slider_position)
mainLayout = QtGui.QVBoxLayout()
mainLayout.addWidget(self.spinbox)
mainLayout.addWidget(self.sld)
mainLayout.addWidget(self.checkButton)
self.setLayout(mainLayout)
self.resize(200, 200)
self.show()
# Runs when interactive mode is disabled
def slider_released(self):
if not self.checkButton.isChecked():
self.myFunction()
def update_spinbox(self, value):
if not self.updateFromSpinbox:
self.spinbox.setValue(float(value)/1000)
if self.checkButton.isChecked():
self.myFunction()
def update_slider_position(self):
self.updateFromSpinbox = True
self.sld.setSliderPosition(self.spinbox.value()*1000)
self.updateFromSpinbox = False
self.myFunction()
# Main function to run when value updates
def myFunction(self):
print self.sld.value()
win = Window()
当您选中进入交互模式的按钮时,myFunction()
将在滑块移动和旋转框完成编辑时调用。如果它被选中以退出交互模式,myFunction()
只会在滑块被释放并且旋转框完成编辑时被调用。