2014-11-10 6 views
0

32 비트 (-2147483648 - 2147483647)보다 큰 정수로 동작하도록 PyQt 스피드 박스를 수정할 수 있습니까? 64 비트 int 데이터 형식으로 C++에서 새로운 스핀 상자를 작성할 수 있다는 것을 알고 있지만이 작업은 복잡 할 것입니다.64 비트 정수를 가진 PyQt4 스핀 박스

답변

0

QDoubleSpinBox을 사용하면 32 비트보다 큰 값의 스핀 상자를 얻을 수 있습니다.

이름에서 알 수 있듯이 최대 2 ** 53 (9,007199254740,992)의 이중 (즉, 부동 소수점) 값을 제공합니다. 정수 값을 원하면 setDecimals(0)을 사용하여 정밀도를 0으로 설정하면됩니다. (주의 : 어떤 이유로 든 Qt Designer는 내장 된 스핀 박스 중 하나에 대해 99,999,999보다 큰 최대 값을 설정하지 않으므로 "수동"으로해야합니다.)

당신이 2보다 큰 ** (53), 서브 클래스 QAbstractSpinBox는, 관련 방법 (stepBy, stepEnabled, validate 가능성이 fixup를) 다시 구현하고 제공 값하려면 어떤 다른 방법이 필요하다고 생각 (예를 들어, value/setValue).

2

힌트를 보내 주셔서 감사합니다. 나는 QDoubleSpinBox를 시도했지만 수동으로 값을 설정하려하지 않았습니다. 왜냐하면 내 목적에 맞지 않기 때문에 자기 자신의 스핀 박스를 썼어. 코드 밑. 다른 사람에게 도움이 될지도 모릅니다. QAbstractSpinBox 서브 클래 싱에 관한 문서는 약간 드물다. 기본 최대 값은 numpy.uint64의 최대 값과 일치합니다. 이론 상으로는 제한이 없어야합니다. QLineEdit이 표현에 사용되기 때문입니다. 20보다 긴 숫자가 필요한 경우 유효성 검사기의 정규 표현식을 적용하면됩니다.

class BigIntSpinbox(QtGui.QAbstractSpinBox): 

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

     self._singleStep = 1 
     self._minimum = -18446744073709551616 
     self._maximum = 18446744073709551615 

     self.lineEdit = QtGui.QLineEdit(self) 

     rx = QtCore.QRegExp("[1-9]\\d{0,20}") 
     validator = QtGui.QRegExpValidator(rx, self) 

     self.lineEdit.setValidator(validator) 
     self.setLineEdit(self.lineEdit) 

    def value(self): 
     try: 
      return int(self.lineEdit.text()) 
     except: 
      raise 
      return 0 

    def setValue(self, value): 
     if self._valueInRange(value): 
      self.lineEdit.setText(str(value)) 

    def stepBy(self, steps): 
     self.setValue(self.value() + steps*self.singleStep()) 

    def stepEnabled(self): 
     return self.StepUpEnabled | self.StepDownEnabled 

    def setSingleStep(self, singleStep): 
     assert isinstance(singleStep, int) 
     # don't use negative values 
     self._singleStep = abs(singleStep) 

    def singleStep(self): 
     return self._singleStep 

    def minimum(self): 
     return self._minimum 

    def setMinimum(self, minimum): 
     assert isinstance(minimum, int) or isinstance(minimum, long) 
     self._minimum = minimum 

    def maximum(self): 
     return self._maximum 

    def setMaximum(self, maximum): 
     assert isinstance(maximum, int) or isinstance(maximum, long) 
     self._maximum = maximum 

    def _valueInRange(self, value): 
     if value >= self.minimum() and value <= self.maximum(): 
      return True 
     else: 
      return False 
관련 문제