首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对QSlider使用float

对QSlider使用float
EN

Stack Overflow用户
提问于 2017-03-16 04:46:44
回答 3查看 5.7K关注 0票数 4

我有一个QLineEdit和一个QSlider,它可以在其中相互交互。

例如:如果我在QLineEdit中设置了一个值,滑块将被更新,或者如果我滑动滑块,它将更新QLineEdit中的值

代码语言:javascript
复制
# If user change value on the slider
self.timer_slider.valueChanged.connect(self.set_value)
# If user sets a value in the text box instead
self.timer_value.textChanged.connect(self.set_slider)

def set_slider(self, value):
    self.timer_slider.setValue(int(value))

def set_value(self, value):
    self.timer_value.setText(str(value))

有没有什么办法可以用float代替int的值呢?

EN

回答 3

Stack Overflow用户

发布于 2018-05-12 06:04:55

@dissidia的答案是好的。但是如果你的应用程序中有很多滑块,或者你需要几种不同的比例因子,那么你就可以通过子类化QSlider来创建自己的QDoubleSlider。

下面的类基于其他人的工作,但有一个额外的功能,如果您链接到QLineEdit或QDoubleSpinBox,您将需要:一个用于valueChanged的名为doubleValueChanged的新信号。

代码语言:javascript
复制
class DoubleSlider(QSlider):

    # create our our signal that we can connect to if necessary
    doubleValueChanged = pyqtSignal(float)

    def __init__(self, decimals=3, *args, **kargs):
        super(DoubleSlider, self).__init__( *args, **kargs)
        self._multi = 10 ** decimals

        self.valueChanged.connect(self.emitDoubleValueChanged)

    def emitDoubleValueChanged(self):
        value = float(super(DoubleSlider, self).value())/self._multi
        self.doubleValueChanged.emit(value)

    def value(self):
        return float(super(DoubleSlider, self).value()) / self._multi

    def setMinimum(self, value):
        return super(DoubleSlider, self).setMinimum(value * self._multi)

    def setMaximum(self, value):
        return super(DoubleSlider, self).setMaximum(value * self._multi)

    def setSingleStep(self, value):
        return super(DoubleSlider, self).setSingleStep(value * self._multi)

    def singleStep(self):
        return float(super(DoubleSlider, self).singleStep()) / self._multi

    def setValue(self, value):
        super(DoubleSlider, self).setValue(int(value * self._multi))
票数 5
EN

Stack Overflow用户

发布于 2017-03-18 01:48:55

在许多发现之后,这对我来说是有效的:

代码语言:javascript
复制
# Connection Signals

# When user tweaks using the slider
self.slider.valueChanged[int].connect(self.update_spinbox)
# When user modify via the spinbox
self.spinbox_value.editingFinished.connect(self.update_slider)


# Functions for each modication made towards slider and spinbox
def update_slider(self):
    # spinbox_value uses float/ doubles type
    # '*100' is used to convert it into integer as QSlider
    # only register integer type
    spinbox_value = self.spinbox_value.value() * 100
    self.slider.setSliderPosition(spinbox_value)

def update_spinbox(self, value):
    # QSlider only uses integer type
    # Need to convert the value from integer into float
    # and divides it by 100
    self.spinbox_value.setValue(float(value) / 100)
票数 1
EN

Stack Overflow用户

发布于 2020-04-26 18:24:52

我修改了bfris的答案,以便用户无法跟踪步骤之间的滑块,如下所示。该类使用了一种不同的方法来实现浮点数的使用,这意味着不需要指定小数位数。

SetInterval方法等同于组合使用setTickIntervalsetSingleStep方法,但也会停止定位在Tick值之间的滑块。

该类还允许设置和读取滑块上选定的点的索引。

代码语言:javascript
复制
class DoubleSlider(qw.QSlider):

    def __init__(self, *args, **kargs):
        super(DoubleSlider, self).__init__( *args, **kargs)
        self._min = 0
        self._max = 99
        self.interval = 1

    def setValue(self, value):
        index = round((value - self._min) / self.interval)
        return super(DoubleSlider, self).setValue(index)

    def value(self):
        return self.index * self.interval + self._min

    @property
    def index(self):
        return super(DoubleSlider, self).value()

    def setIndex(self, index):
        return super(DoubleSlider, self).setValue(index)

    def setMinimum(self, value):
        self._min = value
        self._range_adjusted()

    def setMaximum(self, value):
        self._max = value
        self._range_adjusted()

    def setInterval(self, value):
        # To avoid division by zero
        if not value:
            raise ValueError('Interval of zero specified')
        self.interval = value
        self._range_adjusted()

    def _range_adjusted(self):
        number_of_steps = int((self._max - self._min) / self.interval)
        super(DoubleSlider, self).setMaximum(number_of_steps)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42820380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档