2017-01-25 1 views
0

QSpinBox의 값을 0에서 10까지 2 단계 (예 : 0, 2, 4, 6, 8, 10)로 설정한다고 가정합니다. QSpinBox은 최소 0과 최대 10을 설정할 수 있으며, 단일 단계 2를 설정할 수 있습니다. 사용자가 위/아래 화살표를 클릭하면 잘 작동합니다. 그러나 사용자가 홀수 (예 : 3)를 입력하면 스핀 상자는 여전히 유효하다고 생각하고이를 수락합니다. 내 QSpinBox에서이 경우 홀수를 허용하지 않으려면 어떻게해야합니까?QSpinBox를 유효한 값으로 제한하는 방법

답변

1

이 문제를 해결하려면 valueChanged 신호를 구현하고 값이 올바른지 확인하십시오. 아무 것도하지 않으면 대조를 사용하고 그렇지 않으면 이전 값을 배치하십시오.

예 : 마법처럼

import sys 

from PyQt4.QtCore import pyqtSignal 
from PyQt4.QtGui import QApplication, QSpinBox 


class SpinBox(QSpinBox): 
    # Replaces the valueChanged signal 
    newValueChanged = pyqtSignal(int) 

    def __init__(self, parent=None): 
     super(SpinBox, self).__init__(parent=parent) 

     self.valueChanged.connect(self.onValueChanged) 
     self.before_value = self.value() 
     self.newValueChanged.connect(self.slot) 

    def onValueChanged(self, i): 
     if not self.isValid(i): 
      self.setValue(self.before_value) 
     else: 
      self.newValueChanged.emit(i) 
      self.before_value = i 

    def isValid(self, value): 
     if (self.minimum() - value % self.singleStep()) == 0: 
      return True 
     return False 

    def slot(self, value): 
     print(value) 


if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    w = SpinBox() 
    w.setMinimum(0) 
    w.setMaximum(10) 
    w.setSingleStep(2) 
    w.show() 
    sys.exit(app.exec_()) 
+0

작품. 거의 수정하지 않고 이전 값을 유지하는 대신 가장 가까운 유효한 값으로 값을 설정할 수 있습니다. 감사. – Hongzheng

+0

신중한 테스트를 거친 후 현재 구현에서 몇 가지 문제가 발견되었습니다. 유효하지 않은 값 3에 사용자 유형이 있다고 가정하십시오. 현재 구현에서는 SpinBox.valueChanged 신호가 유효하지 않은 값인 3으로 계속 방출됩니다.이 주소는 어떻게 지정합니까? – Hongzheng

+0

@Hongzheng 물론 신호가 방출되지만 코드가 값을 수정합니다. – eyllanesc