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

Is it possible to highlight text as the user types?

我正在尝试创建一个在用户输入文本时突出显示文本的输入框。

patients = ["AB", "GH", "JS", "LP"]
attributes = ["medication", "weight", "mobility"]
commands = ["get" , "add", "replace", "delete"]

我希望它能以不同的方式格式化每种类型的单词,例如

A​​B 添加药物阿司匹林' -> 'AB 添加 药物“阿司匹林”'

JS 得到药物 -> JS 得到 药物

这可能吗?我不一定要寻找可以实现它的代码;我只是想知道它是否可行,然后再投入认真的时间进行研究。

是的,这是可能的,但仅适用于基于 QTextDocument 的输入小部件,例如 QPlainTextEdit 或 QTextEdit,因为基本的单行小部件 QLineEdit 不支持格式化。

您需要创建一个 QSyntaxHighlighter and override its 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 and also QTextFormat(它从中继承)的文档,其中还提供了有用的函数,例如 setBackgroundsetForeground