正如标题所暗示的,我的目标是将默认光标模式(插入字符)更改为覆盖模式。
我有一个附加到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时,为了写任何东西,我必须选择一个下划线,将其更改为所需的字符,然后选择另一个字符,依此类推。或者,我可以选择整个字符串,删除它,然后写入完整的字符串。然而,重点是,有时我必须在不同的位置更改一些字符串,并保持下划线不变。一个接一个地选择和更改字符是可行的,但很繁琐。当光标焦点在一个对象上时,将光标模式从insert更改为overwrite将是更清晰的解决方案。
发布于 2020-08-06 00:59:00
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_() )
发布于 2020-08-05 18:29:31
看起来您需要设置inputMask()
属性。
在您的情况下,它应该是:
object.setInputMask(
'>NNNN-NNNNNN-NNNNNN-NNNN-NN-NNNNNN;_'
N
掩码字符用于字母数字字符,如果前面带有>
,则表示后面的所有字母都将是大写的。分号后面的任何字符集都用作占位符。
发布于 2020-08-06 01:46:59
仅供参考。musicamante提出的解决方案似乎工作得很好。只有一处修改。假设QRegExpValidator使用的正则表达式如下:
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.setInputMask('>XXXX-XXXXXX-XXXXXX-XXXX-XX-XXXXXX; ')
使用下划线作为正则表达式字符串中的字符之一,并替换InputMask中的空值,我遇到了一些类似下面这样的奇怪结果
而不是期望的
无论如何,再次感谢您的快速帮助。
https://stackoverflow.com/questions/63262810
复制相似问题