是否可以在用户键入时突出显示文本?

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(它继承自)的文档,它们还提供了有用的功能,例如 setBackgroundsetForeground

【讨论】:

我在让它工作时遇到了一些麻烦;如果您使用脚本对此进行了测试并且仍然方便使用,请您发布它吗? @JohnSalter 查看更新。如果您还有更多问题,请说明您遇到的什么问题。 @JohnSalter 1. 我不知道你是怎么导入的,如果你导入一个子模块而不是单个类,那么你必须使用submodule.class(),所以它是QtWidgets.QTextEdit(); 2. 您明确想知道是否可以做到,我已经通过提供基本代码超出了您的问题,抱歉粗鲁,但这不是一个教程网站; 3.您是否按照我的回答创建了QSyntaxHighlighter 的子类? highlightBlock 必须在那个子类中实现,你不能调用它,因为它是一个被 Qt 调用的重写方法; 最后,pyuic 生成的文件不应该被手动修改;这是一种不好的做法,几乎总是会导致错误和意外行为,因为这些文件仅用作主脚本中的导入模块,而主脚本实际上包含程序的逻辑实现。如果你想使用 UI 文件,那么请遵循官方关于 using Designer 的指南。 抱歉,我误读了您的原始答案,并在发表我的评论后才意识到。我已接受答案。

以上是关于是否可以在用户键入时突出显示文本?的主要内容,如果未能解决你的问题,请参考以下文章

在 textarea Reactjs 中键入时突出显示文本

Eclipse Py-dev,深色主题在键入时删除文本突出显示?

无法关闭 Vim 文本突出显示 [重复]

如何在swift中突出显示文本时触发事件

双击文本区域或文本框时指定突出显示行为?

如何使用 PDFKit 突出显示 pdf 中的选定文本?