2016-11-23 15 views
3

QDoubleSpinBoxに問題があります。 「バックスペース」キーの動作を編集する方法は、サフィックスのサイズによって異なります。 "m"を接尾辞として設定した場合、スピンボックスの最後にカーソルを合わせて "backspace"を押すと、カーソルが "m"接尾辞の上にジャンプし、さらに "backspaces"で編集できます。 接尾辞を "mm"または任意の二重文字に設定した場合、カーソルが何回押してもスピンボックスの最後にカーソルが残ります。QDoubleSpinBoxの "backspace"キーの編集動作

私は、「検証」メソッドに何が来るのかをデバッグしようとした、と独特の結果だ:カーソルが「0,00m」の末尾にある一方で、「バックスペース」が押された場合 を、「0,00m」を受信検証。 カーソルが "0,00_m"の最後にあるときに "バックスペース"が押されたときvalidateは "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) 
関連する問題