0

私が書いたアニメーション ツールの ui を作成しています。UI は QDoubleSpinBox と QSlider で構成されます。値を変換する関数を使用して、QSlider を QDoubleSpinBox に接続しました。スライダーの valueChange でスピンボックスを更新し続けたいと思います。また、スピンボックスのeditingFinished()でスライダーハンドルの位置を更新したいと思います。この接続が機能しています。

ツールには 2 つのモードがあります。「インタラクティブ」と「非インタラクティブ」。Interactive は、スライダーが移動すると、スピンボックス/スライダーの値をパラメーターとして、アニメーション ツールのメイン関数を呼び出します。非インタラクティブ モードは、スライダーが離されたときにのみツールの関数を呼び出すことを意図しています。スライダーの 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() を切り替えます。

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 に答える