0

我正在为我编写的动画工具创建一个 ui。ui 由 QDoubleSpinBox 和 QSlider 组成。我已经使用函数将 QSlider 连接到 QDoubleSpinBox 以转换它们的值。我想用滑块的 valueChange 来保持 spinbox 的更新。我还希望 spinbox 的 editingFinished() 更新滑块手柄的位置。我有这个连接工作。

该工具有两种模式;“交互式”和“非交互式”。Interactive在滑块移动时调用我的动画工具的主要功能,并以旋转框/滑块的值作为参数。非交互模式意味着只有在释放滑块时才调用我的工具的功能。看起来滑块上的 setTracking() 是答案,但当然它打破了旋转框始终显示滑块值的行为。

有没有办法让 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)

用户界面中的菜单切换滑块的 setTracking()。

4

1 回答 1

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()则只会在释放滑块并且旋转框完成编辑时调用。

于 2015-09-07T07:23:33.700 回答