Die einfache Lösung ist die valueChanged
für jeden Schieber/Nummernfeld auf einen Schlitz zu verbinden, die
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)
Eine bessere Lösung die Werte synchronisiert ist eine benutzerdefinierte Slider-Klasse zu definieren, die alles intern behandelt. Auf diese Weise müssen Sie nur einmal mit der Synchronisation umgehen.
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_()
bearbeiten: Im Hinblick auf die Stellungnahme von ekhumoro kann die obige Klasse vereinfacht werden, um
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)
Sie werden wahrscheinlich wollen auch einige der QSlider
Methoden nachzuahmen sich ändern die Reichweite und den Wert. Beachten Sie, dass wir nichts explizit auf self.numbox
setzen müssen, da die oben genannten Signal/Slot-Verbindungen dafür sorgen.
@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)
Ich denke @spikespaz will nur den numerischen Wert mit dem Schieberegler Position synchronisieren – user3419537
@ user3419537 Woops, das ist durchaus möglich. Ich schätze, ich habe das Problem ein wenig überstiegen. Das Tutorial, das ich gepostet habe, gilt jedoch immer noch. – Ian
Ja, die beiden Gruppen von Slider/Textboxen sind getrennt, aber ich werde weitermachen und das von Ihnen gepostete Tutorial sehen. Danke für die Hilfe. – spikespaz