是否可以在用户键入时突出显示文本?
Posted
技术标签:
【中文标题】是否可以在用户键入时突出显示文本?【英文标题】:Is it possible to highlight text as the user types? 【发布时间】:2021-11-13 13:35:37 【问题描述】:我正在尝试创建一个输入框,在用户书写时突出显示文本。
patients = ["AB", "GH", "JS", "LP"]
attributes = ["medication", "weight", "mobility"]
commands = ["get" , "add", "replace", "delete"]
我希望它以不同的方式格式化每种类型的单词,例如
AB 添加药物阿司匹林' -> 'AB 添加 MEDICATION "阿司匹林"'
JS 拿药 -> JS get 药物
这可能吗?我不必寻找可以实现它的代码;在我投入大量时间研究之前,我只想知道它是否可行。
【问题讨论】:
【参考方案1】:是的,这是可能的,但仅限于基于 QTextDocument 的输入小部件,例如 QPlainTextEdit 或 QTextEdit,因为基本的单行小部件 QLineEdit 不支持格式化。
您需要创建QSyntaxHighlighter 的子类并覆盖其highlightBlock()
函数,然后循环遍历所有组,创建有效的正则表达式并提供相关格式:
def highlightBlock(self, text):
fmt = QtGui.QTextCharFormat()
fmt.setFontWeight(QtGui.QFont.Bold)
patientList = '|'.join('()'.format(v) for v in patients)
patientRegEx = QtCore.QRegularExpression(
r'\b()\b'.format(patientList)
)
rxIter = QtCore.QRegularExpressionMatchIterator(
patientRegEx.globalMatch(text))
while rxIter.hasNext():
match = rxIter.next()
self.setFormat(
match.capturedStart(),
match.capturedLength(),
fmt)
然后在文档上设置荧光笔进行文本编辑:
self.inputField = QTextEdit()
self.highlighter = MySyntaxHighlighter(self.inputField.document())
请注意,语法高亮显示中似乎有一个已知且未解析的bug,因此设置字体大写不起作用。
不幸的是,没有简单的解决方法,因此您需要找到其他方法来突出显示属性。
要了解可用于字符格式的选项,请参阅 QTextCharFormat 和 QTextFormat(它继承自)的文档,它们还提供了有用的功能,例如 setBackground
和 setForeground
。
【讨论】:
我在让它工作时遇到了一些麻烦;如果您使用脚本对此进行了测试并且仍然方便使用,请您发布它吗? @JohnSalter 查看更新。如果您还有更多问题,请说明您遇到的什么问题。 @JohnSalter 1. 我不知道你是怎么导入的,如果你导入一个子模块而不是单个类,那么你必须使用submodule.class()
,所以它是QtWidgets.QTextEdit()
; 2. 您明确想知道仅是否可以做到,我已经通过提供基本代码超出了您的问题,抱歉粗鲁,但这不是一个教程网站; 3.您是否按照我的回答创建了QSyntaxHighlighter
的子类? highlightBlock
必须在那个子类中实现,你不能调用它,因为它是一个被 Qt 调用的重写方法;
最后,pyuic 生成的文件不应该被手动修改;这是一种不好的做法,几乎总是会导致错误和意外行为,因为这些文件仅用作主脚本中的导入模块,而主脚本实际上包含程序的逻辑实现。如果你想使用 UI 文件,那么请遵循官方关于 using Designer 的指南。
抱歉,我误读了您的原始答案,并在发表我的评论后才意识到。我已接受答案。以上是关于是否可以在用户键入时突出显示文本?的主要内容,如果未能解决你的问题,请参考以下文章