到达末尾时循环通过 QSpinbox
Loop through QSpinbox when reaches the end
有没有什么方法可以创建一个 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)
一个解决策略是在最后一个元素之前和最后添加一个元素,以便按钮保持启用状态,我们拦截更改,这样就不会转到最后一个转到第二个,反之亦然,而不是转到第一个,一定要看最后一个
示例:
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_())
注意:由于您使用的是字典,这些不能有重复的键,我建议您添加的元素与您显示的文本不同。
使用spinbox.setWrapping(True)
方法
这是一种重复旋转框值的内置方法
有没有什么方法可以创建一个 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)
一个解决策略是在最后一个元素之前和最后添加一个元素,以便按钮保持启用状态,我们拦截更改,这样就不会转到最后一个转到第二个,反之亦然,而不是转到第一个,一定要看最后一个
示例:
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_())
注意:由于您使用的是字典,这些不能有重复的键,我建议您添加的元素与您显示的文本不同。
使用spinbox.setWrapping(True)
方法
这是一种重复旋转框值的内置方法