4

QDoubleSpinBox に問題があります。「バックスペース」キーの編集動作は、サフィックスのサイズに依存します。サフィックスとして「m」を設定し、カーソルをスピンボックスの最後に設定して「バックスペース」を押すと、カーソルは「m」サフィックスを超えて値にジャンプし、さらに「バックスペース」で編集できます。サフィックスを「mm」または任意の 2 文字の単語に設定すると、「バックスペース」を何回押しても、カーソルはスピンボックスの最後に残ります。

「validate」メソッドに入るものをデバッグしようとしたところ、奇妙な結果が得られました。カーソルが「0,00m」の末尾にあるときに「バックスペース」を押すと、validate は「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_()
4

1 に答える 1

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)
于 2016-11-23T20:00:27.967 に答える