2017-12-06 20 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

あなたが試したことを示してください。 SOはコーディングサービスではありませんので、以下をお読みください。[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メソッドが呼び出されないように、条件に戻り値を追加しないでください。 –

+0

@ NicolasQuiroz私の考えは、値が更新される前にこのメソッドをフィルタとして使用することです。あなたがeditingFinishedを使用しようとしたが、変更後に発行されたため、失敗します。 – eyllanesc

+0

恐ろしく、今すぐお試しください! –

関連する問題