首页 > 解决方案 > 输入QLineEdit时如何将默认光标模式从插入更改为覆盖

问题描述

正如标题所暗示的,我的目标是将默认光标模式(插入字符)更改为覆盖模式。

我有一个附加到 QLineEdit 对象的验证器

expression = QtCore.QRegExp(r'(^[A-Z0-9_]{4})-([A-Z0-9_]{6})-([A-Z0-9_]{6})-([A-Z0-9_]{4})-([A-Z0-9_]{2})-([A-Z0-9_]{6})')
object = QtGui.QRegExpValidator(expression, self)

QLineEdit 组件的默认值为:

object.setText('____-______-______-____-__-______')

输入 QLineObject 时,为了写任何东西,我必须选择一个下划线,将其更改为所需的字符,选择另一个,依此类推。或者,我可以选择整个字符串,将其删除,然后写入完整的字符串。然而,关键是有时我必须在不同的位置更改一些字符串并保持不变的下划线不变。一个接一个地选择和改变一个字符是可行的,但很乏味。当光标焦点位于一个对象上时,将光标模式从插入更改为覆盖将是更清洁的解决方案。

标签: pythonpyqtpyqt5qlineedit

解决方案


QLineEdit 没有覆盖模式。但是 QTextEdit 和 QPlainTextEdit 有 overwriteMode 和 setOverwriteMode(bool)。如果您可以使用 QTextEdit,您可以将其子类化并拥有自己的 keyReleaseEvent。这是一个测试覆盖模式的快速示例。每次用户按下键盘上的 Insert 键时,都会切换 overwriteMode。

from PyQt5.QtWidgets import (QApplication, QMainWindow, QTextEdit)
from PyQt5 import QtCore
import sys

class OverwriteTextBox(QTextEdit):
    def __init__(self, parent=None):
        super(OverwriteTextBox, self).__init__(parent=parent)
        
    def keyReleaseEvent(self, event):
        key = event.key()
        
        if (key == QtCore.Qt.Key_Insert):
            print('insert')
            self.setOverwriteMode(not self.overwriteMode())
        else:
            # release keyrelease for normal behaviors
            super().keyReleaseEvent(event)

class Example(QMainWindow):
    def __init__(self, parent=None):
     
        super(Example, self).__init__(parent=parent)

        self.setGeometry(300, 200, 570, 450)
        self.setWindowTitle("Overwrite test")            
        self.textbox = OverwriteTextBox(parent=self)
        self.textbox.setGeometry(50, 50, 200, 50)

app = QApplication(sys.argv)
example = Example()         
example.show()
sys.exit(app.exec_() )

推荐阅读