【问题标题】:Is it possible to highlight text as the user types?是否可以在用户键入时突出显示文本?
【发布时间】:2023-03-20 17:49:01
【问题描述】:

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

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

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

AB 添加药物阿司匹林' -> 'AB 添加 MEDICATION "阿司匹林"'

JS 拿药 -> JS get 药物

这可能吗?我不必寻找可以实现它的代码;在我投入大量时间研究之前,我只想知道它是否可行。

【问题讨论】:

    标签: python user-interface text pyqt


    【解决方案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,因此设置字体大写不起作用

    不幸的是,没有简单的解决方法,因此您需要找到其他方法来突出显示属性。

    要了解可用于字符格式的选项,请参阅 QTextCharFormatQTextFormat(它继承自)的文档,它们还提供了有用的功能,例如 setBackgroundsetForeground

    【讨论】:

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