2016-11-23 3 views
3

QDoubleSpinBox에 문제가 있습니다. "백 스페이스"키의 편집 동작은 어떻게 든 접미어의 크기에 따라 다릅니다. "m"을 접미사로 설정 한 다음 스핀 상자의 끝에 커서를 놓고 "backspace"를 누르면 커서가 "m"접미사를 넘어서 "backspaces"로 편집 할 수있는 값으로 이동합니다. 접미어를 "mm"또는 이중 문자로 설정하면 얼마나 많은 "백 스페이스"를 눌러도 커서는 회전 상자의 끝에 남습니다.QDoubleSpinBox의 "백 스페이스"키 편집 동작

"유효성 검사"방법으로 들어가는 것을 디버그하려고 시도하고 특이한 결과가 발생했습니다 : 커서가 "0,00m"의 끝 부분에있는 동안 "백 스페이스"를 누르면 유효성 검사가 "0,00m" . 커서가 "0,00_m"의 끝 부분에있는 동안 "백 스페이스"를 누르면 유효 확인은 "0,00__m"을 수신합니다 커서가 "0,00_mm"의 끝 부분에있는 동안 "백 스페이스"를 누르면 유효성 검사는 " 0,00_m_mm "

이러한 동작의 원인은 무엇이며 어떻게 극복 할 수 있습니까? 이 키 이벤트 처리에 관해서

# coding=utf-8 
from PyQt5 import QtWidgets 


class SpinBox(QtWidgets.QDoubleSpinBox): 
    def __init__(self): 
     super().__init__() 

    def validate(self, text, index): 
     res = super().validate(text, index) 
     print(text, res, self.text()) 
     return res 

if __name__ == "__main__": 
    q_app = QtWidgets.QApplication([]) 
    sb = SpinBox() 
    sb.setSuffix(" m") 
    sb.show() 
    q_app.exec_() 

답변

2

QDoubleSpinBox/QAbstractSpinBox의 소스 코드는 매우 복잡하다 - 나는 기본 동작 있어야 할 경우, 또는 경우에도 구현 될 수있는 무엇을 작동하지 않을 수 있습니다. 어딘가에 버그가 있을지 모르지만 나는 그것에 대해 내기를 원하지 않을 것입니다. 유일한 옵션은 다시 구현할처럼

은 같습니다 keyPressEvent :

class SpinBox(QtWidgets.QDoubleSpinBox): 
    def keyPressEvent(self, event): 
     if event.key() == QtCore.Qt.Key_Backspace: 
      suffix = self.suffix() 
      if suffix: 
       edit = self.lineEdit() 
       text = edit.text() 
       if (text.endswith(suffix) and 
        text != self.specialValueText()): 
        pos = edit.cursorPosition() 
        end = len(text) - len(suffix) 
        if pos > end: 
         edit.setCursorPosition(end) 
         return 
     super().keyPressEvent(event) 
관련 문제