同步PyQt5中的两个元素值

2024-09-28 05:22:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个滑块和一个包含整数的文本框(是否有一个专用的整数框?)在PyQt5中并排显示。在

我需要这两个值同步,我现在的方法是用一个QtTimer和if语句来检测一个值是否比另一个值更改得更晚,然后更新相反的元素。我被告知这是“骇人听闻的”,我想知道有没有合适的方法来做这件事。在

您可以看到文本框值和滑块,我需要同步在下面的图像的空白区域。在

Interface example


Tags: 方法图像区域元素if整数语句空白
2条回答

你可以直接将每个滑块连接到另一个滑块上。我不知道你想要的滑块之间的确切连接,但它可能看起来像这样。在

max_player_slider.valueChanged.connect(self.slider1_fu)
npc_stream_slider.valueChanged.conenct(self.slider2_fu)

def slider1_fu(self):
    # do stuff with the npc_stream_slider

def slider2_fu(self):
    # do stuff with the max_player_slider

编辑:这里有一个Tutorial on YouTube可能会有帮助。在

简单的解决方案是将每个滑块/数字框的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)

更好的解决方案是定义一个在内部处理所有事情的自定义滑块类。这样,您只需处理一次同步。在

^{pr2}$

编辑:对于Ekhurvo的评论,可以简化为

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)

相关问题 更多 >

    热门问题