2015-09-07 135 views
0

我正在为我写的动画工具创建一个UI。 ui包含一个QDoubleSpinBox和一个QSlider。我已将QSlider连接到带有函数的QDoubleSpinBox以转换它们的值。我想通过滑块的valueChange保持spinbox更新。我还想要spinbox的editingFinished()来更新滑块句柄的位置。我有这个连接工作。获取一个QDoubleDinSpinBox来显示QSlider的(转换)值并仍然使用setTracking(False)

该工具有两种模式; “互动”和“非互动”。交互式调用我的动画工具的主要功能作为滑块移动,以spinbox的/滑块的值作为参数。非交互式模式仅在释放滑块时才会调用我的工具函数。它看起来像滑块上的setTracking()就是答案,但它当然会中断spinbox的始终显示滑块值的行为。

有没有办法让spinbox连接到滑块的值并仍然在滑块上使用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()。

回答

2

它可能不像您想要的那样优雅和简单,但它应该是您以后的行为。

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()

相关问题