2017-12-06 4 views
0

끝까지 도달하고 다시 위로 버튼을 누르면 QSpinbox를 처음 값으로 설정하는 방법이 있습니까?끝까지 도달하면 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) 
+0

시도한 것을 보여주십시오. 이제 코딩 서비스가 아닙니다. 다음을 읽어보십시오 : [ask] – eyllanesc

+1

@eyllanesc 지금 추가하기 –

+0

이 예제에서는 TonoFactory를 사용해야합니까? – eyllanesc

답변

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

참고 : 당신이 사전을 사용하고 이러한 반복 할 수 없습니다 키, 당신이 추가 요소가 당신이 보여주는 텍스트와 다른 것이 좋습니다입니다.

+0

super 메소드가 호출되지 않도록 조건문에 return을 추가하지 않아야합니까? –

+0

@ NicolasQuiroz 제 생각은 값이 업데이트되기 전에 필터로만이 메서드를 사용하는 것입니다. 귀하의 경우에는 editingFinished를 사용하려했으나 변경 후에 발행되므로 실패합니다. – eyllanesc

+0

굉장하다, 지금 당장, 고마워! –

관련 문제