2012-02-23 3 views
1

Я делаю связь между QSpinbox и QSlider.
QSpinbox имеет диапазон от -10,0 до 10,0, а QSlider имеет диапазон от -100 до 100.
Итак, значение QSlider, деленное на 10, подключается к QSpinbox и наоборот.
Я использую знак "valueChanged()" СИГНАЛА друг другу.
И я хочу набрать «3.5» в QSpinbox, в этом случае, когда я набираю только «3», значение «ValueChanged» QSpinbox меняет значение QSlider, а QSlider делает это снова. Таким образом, QSpinbox потеряет свое внимание.
Я не могу набрать «3.5» одним выстрелом.
"valueChanged()" СИГНАЛ работает слишком усердно :)
Как я могу решить эту проблему?PyQt4: Синхронизация между QSpinbox и QSlider

ответ

3

Сигнал valueChanged() действительно предназначен для активного стрельбы по мере его изменения. Если вы хотите, сигнал срабатывает, когда редактирование завершено, есть сигнал, специально для этого называется editingFinished: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qabstractspinbox.html#editingFinished

Вы можете не заметить, потому что его член суперкласса QAbstractSpinBox. Обратите внимание, что этот сигнал загорается, когда виджет теряет фокус или пользователь попадает в него. Если это не то поведение, в котором вы хотите, то единственным оставшимся вариантом является использование QTimer с небольшой задержкой, которая перезапускается каждый раз valueChanged, а когда пользователь ждет достаточно долго, тайм-аут фактически обновит ваш слайдер.

Я также заметил, что вы пытаетесь использовать нецелые значения с QSpinBox, который предназначен для ints. Возможно, вы захотите попробовать QDoubleSpinBox, который предназначен для плавающей точности. valueChange() может вести себя немного лучше, ожидая десятичного. Хотя я просто догадываюсь, так как я не тестировал его: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qdoublespinbox.html

+0

Я изменил «valueChanged» на «editFinished». Спасибо! –