Простое решение для подключения valueChanged
для каждого ящика слайдер/номер слоту, который синхронизирует значения
self.slider1.valueChanged.connect(self.handleSlider1ValueChange)
self.numbox1.valueChanged.connect(self.handleNumbox1ValueChange)
@QtCore.pyqtSlot(int)
def handleSlider1ValueChange(self, value):
self.numbox1.setValue(value)
@QtCore.pyqtSlot(int)
def handleNumbox1ValueChange(self.value):
self.slider1.setValue(value)
Лучшее решение для определения пользовательского класса слайдер, который обрабатывает все внутри. Таким образом, вам нужно только обработать синхронизацию один раз.
from PyQt5 import QtCore, QtWidgets
class CustomSlider(QtWidgets.QWidget):
def __init__(self, *args, **kwargs):
super(CustomSlider, self).__init__(*args, **kwargs)
self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
self.slider.valueChanged.connect(self.handleSliderValueChange)
self.numbox = QtWidgets.QSpinBox()
self.numbox.valueChanged.connect(self.handleNumboxValueChange)
layout = QtWidgets.QHBoxLayout(self)
layout.addWidget(self.numbox)
layout.addWidget(self.slider)
@QtCore.pyqtSlot(int)
def handleSliderValueChange(self, value):
self.numbox.setValue(value)
@QtCore.pyqtSlot(int)
def handleNumboxValueChange(self, value):
# Prevent values outside slider range
if value < self.slider.minimum():
self.numbox.setValue(self.slider.minimum())
elif value > self.slider.maximum():
self.numbox.setValue(self.slider.maximum())
self.slider.setValue(self.numbox.value())
app = QtWidgets.QApplication([])
slider1 = CustomSlider()
slider2 = CustomSlider()
window = QtWidgets.QWidget()
layout = QtWidgets.QVBoxLayout(window)
layout.addWidget(slider1)
layout.addWidget(slider2)
window.show()
app.exec_()
Редактировать: Что касается комментариев от ekhumoro, выше класс может быть упрощена
class CustomSlider(QtWidgets.QWidget):
def __init__(self, *args, **kwargs):
super(CustomSlider, self).__init__(*args, **kwargs)
self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
self.numbox = QtWidgets.QSpinBox()
self.numbox.setRange(self.slider.minimum(), self.slider.maximum())
self.slider.valueChanged.connect(self.numbox.setValue)
self.slider.rangeChanged.connect(self.numbox.setRange)
self.numbox.valueChanged.connect(self.slider.setValue)
layout = QtWidgets.QHBoxLayout(self)
layout.addWidget(self.numbox)
layout.addWidget(self.slider)
Вы, вероятно, также хотят, чтобы имитировать некоторые из QSlider
методов для изменения диапазон и значение. Обратите внимание, что нам не нужно явно указывать что-либо на self.numbox
, поскольку связанные с ним соединения с сигналом/слотом позаботятся об этом.
@QtCore.pyqtSlot(int)
def setMinimum(self, minval):
self.slider.setMinimum(minval)
@QtCore.pyqtSlot(int)
def setMaximum(self, maxval):
self.slider.setMaximum(maxval)
@QtCore.pyqtSlot(int, int)
def setRange(self, minval, maxval):
self.slider.setRange(minval, maxval)
@QtCore.pyqtSlot(int)
def setValue(self, value):
self.slider.setValue(value)
Я думаю @spikespaz просто хочет синхронизировать числовое значение с позиции ползунка – user3419537
@ user3419537 Woops, что вполне возможно. Наверное, я немного перепутал проблему. Однако учебник, который я написал, все еще применяется. – Ian
Да, два набора слайдеров/текстовых полей являются отдельными, но я продолжу и посмотрю учебник, который вы разместили. Спасибо за помощь. – spikespaz