到达终点时循环QSpinbox

Posted

技术标签:

【中文标题】到达终点时循环QSpinbox【英文标题】:Loop through QSpinbox when reaches the end 【发布时间】:2017-12-06 23:50:31 【问题描述】:

有什么方法可以创建一个 QSpinbox 将自己设置为第一个值,当它到达末尾并再次按下步进按钮?

我尝试在自定义 QSpinBox 中执行此操作,但发生的情况是,当它达到最后一个值时,y 会立即重置,这导致永远看不到最后一个值。

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)

【问题讨论】:

显示您尝试过的内容。 SO 不是编码服务,请阅读以下内容:How to Ask @eyllanesc 现在添加它 这个例子需要用到TonoFactory吗? 【参考方案1】:

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

例子:

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_())

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

【讨论】:

你不应该在条件句中添加一个 return 以便不调用 super 方法吗? @NicolasQuiroz 我的想法是仅在更新值之前将此方法用作过滤器,在您的情况下,您尝试使用editingFinished但在更改后发出,这就是它失败的原因。跨度> @NicolasQuiroz 阅读我的笔记 您必须在字符串中再添加 2 个值,一个在开头,一个在结尾,这些只是为了填充。【参考方案2】:

使用spinbox.setWrapping(True)方法

重复旋转框的值是一种内置方法

【讨论】:

以上是关于到达终点时循环QSpinbox的主要内容,如果未能解决你的问题,请参考以下文章

当某些点被阻挡时到达终点的最小跳跃

离子幻灯片(ion-slides):到达终点时隐藏寻呼机

HDU 1010 Tempter of the Bone(深度+剪枝)

滚动条没有到达表格视图的末尾

省选模拟27

省选模拟27