首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >到达终点时循环通过QSpinbox

到达终点时循环通过QSpinbox
EN

Stack Overflow用户
提问于 2017-12-06 23:50:31
回答 2查看 373关注 0票数 1

是否有任何方法来创建一个QSpinbox,当它到达末尾,并再次按下“向上”按钮时,将自己设置为第一个值?

我尝试在自定义的QSpinBox中这样做,但是当它到达最后一个值时,y会立即被重置,这导致永远看不到最后一个值。

代码语言:javascript
复制
from PyQt5.QtWidgets import QSpinBox
from music import TonoFactory

_tf = TonoFactory()


class StringBox(QSpinBox):
    def __init__(self, parent=None):
        super(StringBox, self).__init__(parent)
        strings = []
        for key in _tf.notas.keys():
            strings.append(key)
        self.setStrings(strings)
        self.editingFinished.connect(self.reset_spin)

    def strings(self):
        return self._strings

    def setStrings(self, strings):
        strings = list(strings)
        self._strings = tuple(strings)
        self._values = dict(zip(strings, range(len(strings))))
        self.setRange(0, len(strings) - 1)

    def textFromValue(self, value):
        return self._strings[value]

    def valueFromText(self, text):
        return self._values[text]

    def reset_spin(self):
        if self.value() == len(self.strings()) -1:
            self.setValue(0)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-07 00:39:14

一种解决方案是在前面和最后一个元素中添加一个元素,这样按钮就保持启用状态,我们拦截这些更改,这样我们就可以不去最后一个去第二个,反之亦然,而不是去第一个,你必须去到最后一个。

示例:

代码语言:javascript
复制
class StringBox(QSpinBox):
    def __init__(self, parent=None):
        super(StringBox, self).__init__(parent)
        strings = []
        texts = ["do", "re", "mi", "fa", "sol", "la", "si"]
        for key in texts:
            strings.append(key)
        self.setStrings([""] + strings + ["-"])
        self.setValue(1)

    def strings(self):
        return self._strings

    def setStrings(self, strings):
        strings = list(strings)
        self._strings = tuple(strings)
        self._values = dict(zip(strings, range(len(strings))))
        self.setRange(0, len(strings)-1)

    def textFromValue(self, value):
        return self._strings[value]

    def valueFromText(self, text):
        return self._values[text]

    def stepBy(self, step):
        if self.value() == 1 and step == -1:
            self.setValue(self.maximum())
        elif self.value() == self.maximum() -1  and step == 1:
            self.setValue(0)
        QSpinBox.stepBy(self, step)


if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    w = StringBox()
    w.show()
    sys.exit(app.exec_())

备注:,因为您使用的是字典,并且这些字典不能有重复的键,所以我建议您添加的元素与您显示的文本不同。

票数 2
EN

Stack Overflow用户

发布于 2020-05-28 18:51:22

使用spinbox.setWrapping(True)方法

这是一种重复旋转盒值的内建方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47685405

复制
相关文章

相似问题

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