2015-09-07 5 views
0

Я создаю ui для инструмента анимации, который я написал. Ui состоит из QDoubleSpinBox и QSlider. Я подключил QSlider к QDoubleSpinBox с функциями для преобразования их значений. Я бы хотел, чтобы обновление spinbox изменялось с помощью параметра ValueChange ползунка. Мне также хотелось бы, чтобы редактирование spinboxFinished() обновляло положение ползунка. У меня это соединение работает.Получение QDoubleDoubleSpinBox для отображения (преобразованного) значения QSlider и по-прежнему использовать setTracking (False)

Существует два режима работы инструмента; «интерактивный» и «неинтерактивный». Интерактивный вызов основной функции моего анимационного инструмента при перемещении ползунка, с параметром spinbox/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() ползунка.

ответ

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() будет вызываться только при отпускании слайдера, а сеанс форматирования - редактирование.