2016-11-23 16 views
3

У меня проблема с QDoubleSpinBox. Редактирование поведения ключа «backspace» каким-то образом зависит от размера суффикса. Если я установил «m» в качестве суффикса, тогда установите курсор в конце спинбокса и нажмите «backspace», курсор переместится над суффиксом «m» к значению, которое затем можно отредактировать с помощью дополнительных «обратных пространств». Если я устанавливаю суффикс на «мм» или любое двунаправленное слово, курсор остается в конце спинбокса независимо от того, сколько «обратных шагов» я нажимаю.Редактирование поведения клавиши «backspace» QDoubleSpinBox

Я попытался отладить то, что входит в метод проверки и получил особый результат: Когда нажата кнопка «backspace», когда курсор находится в конце «0,00 м», подтверждение принимает «0,00 м», , Когда «backspace» нажата, когда курсор находится в конце «0,00_m», подтверждение принимает «0,00__m» Когда «backspace» нажата, когда курсор находится в конце «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)