2

我有一个 QPlainTextEdit 小部件,并试图让光标自动选择插入的文本。我目前的方法是使用 QTextCursor.WordLeft 向后选择,因为使用 .insertText() 会将光标移动到该单词的末尾。谢谢!

编辑:进一步说明:理想情况下,我希望插入的文本突出显示,光标位于插入单词的开头。例如: 状态 1 -> 状态 2

状态 1 显示一个输入字。然后,一旦用户点击空格键,程序就会插入一个单词,突出显示它,并将光标放在该插入单词的开头,如状态 2 所示。

class TextBox(QPlainTextEdit):
    def __init__(self):
        QPlainTextEdit.__init__(self)

        font = QtGui.QFont()
        font.setPointSize(12)
        self.setFont(font)

    def keyPressEvent(self, keyEvent):
        super(TextBox, self).keyPressEvent(keyEvent)

        if keyEvent.key()  == Qt.Key_Return :
            self.clear()

        elif keyEvent.key() == Qt.Key_Space:
            cursor = self.get_cursor()
            cursor.insertText("test")    # The area of concern
            cursor.selectionStart()
            cursor.movePosition(QtGui.QTextCursor.WordLeft, QtGui.QTextCursor.KeepAnchor, 1)
            cursor.selectionEnd()
            # Moving the cursor position doesn't seem to do anything


    def get_cursor(self):
        return self.textCursor()

    def get_cursor_pos(self):
        return self.get_cursor().position()
4

1 回答 1

3

您缺少的是要应用光标位置和选择,必须将光标设置回文本编辑。

class TextBox(QPlainTextEdit):
    # ...

    def keyPressEvent(self, keyEvent):
        super(TextBox, self).keyPressEvent(keyEvent)

        if keyEvent.key()  == Qt.Key_Return :
            self.clear()

        elif keyEvent.key() == Qt.Key_Space:
            cursor = self.textCursor()
            cursor.insertText("test")
            cursor.movePosition(QtGui.QTextCursor.WordLeft, QtGui.QTextCursor.KeepAnchor, 1)
            self.setTextCursor(cursor)

请记住,由于您调用的是 keyPressEvent 的基类实现,因此您总是会在“新”文本之前得到一个空格。如果出于某种原因您想避免这种情况,那么每当您获得空格键时都必须忽略它。

    def keyPressEvent(self, keyEvent):
        if keyEvent.key()  == Qt.Key_Return :
            self.clear()

        elif keyEvent.key() == Qt.Key_Space:
            cursor = self.textCursor()
            pos = cursor.position()
            cursor.insertText("test")
            cursor.setPosition(pos, QtGui.QTextCursor.KeepAnchor)
            self.setTextCursor(cursor)
            # by returning, the event won't be sent to the default implementation
            return

        super(TextBox, self).keyPressEvent(keyEvent)
于 2019-11-03T23:31:53.690 回答