QLineEdit上使用QCompleter完成插入文本的部分匹配功能

4
我创建了一个QLineEdit用于读取中缀数学表达式。运算符仅限于+-*/和括号。值可以是数字或代表数字值的变量名。我想为变量名提供自动完成功能。
问题在于,显然简单的QComplete仅适用于单个预定义单词/短语。它们无法在其他单词之间工作(当您修改表达式时可能会这样做)。
我尝试阅读Tree Model Completer,但由于我正在使用Python编程,所以对我并没有太大帮助。有人知道用Python编写的简单Tree Model Completer示例吗?

所以你想要在表达式中自动完成之前输入过但未被预定义的变量名?如果是这样,那么只需即时提取相关变量名,然后从中填充自动完成器。大多数高级文本编辑器都具有此功能:通常称为“从文档自动完成”或类似名称。 - ekhumoro
变量名已经定义好了。我只是在寻找PyQt中树模型自动完成器的示例代码。 - Mark Ang
@ekhumoro那样做行不通,因为自动完成器已经检查了整个输入的文本,它不知道什么是变量名,什么是公式的其余部分。 - Trilarion
使用树模型自动完成器在这里并没有什么帮助。你需要做的是在任何给定点解析公式,找出当前变量名称存根,然后只对该部分调用某种自动完成器并完成它。 - Trilarion
@Trilarion。我现在明白混淆的原因了。当OP说“QCompleter”时,他们实际上是指QLineEdit使用的标准完成机制。但是,QCompleter类本身比那更灵活。对于自定义自动完成器,需要使用QCompleter.setWidget()并实现自己的完成机制。但是,就像你所说的那样,没有必要使用Tree Model - 只需简单地从文档中“自动完成”即可。 - ekhumoro
@ekhumoro 谢谢您的解释。它让我走上了编译一个小示例作为答案的正确轨道。 - Trilarion
1个回答

3
阅读 ekhumoros 的 评论 后,我决定为自定义 Completer 制作一个简短的示例。
这是示例:
from PySide import QtGui

class CustomCompleter(QtGui.QCompleter):

    def __init__(self):
        super().__init__()

    def splitPath(self, path):
        if path.endswith('ha'):
            self.setModel(QtGui.QStringListModel([path + 'llo']))
        return [path]

app = QtGui.QApplication([])

e = QtGui.QLineEdit()
c = CustomCompleter()
e.setCompleter(c)
e.show()

app.exec_()

每次文本以“ha”结尾时,它会建议使用“llo”来继续。例如,它看起来像这样:

enter image description here

所有的工作都在QCompletersplitPath(path)中完成,每次我改变编辑字段的文本时都会调用两次。经过一些文本处理后,应该使用一个简单的字符串列表将模型设置为新的,其中包含一个或多个建议。似乎必须每次重新设置模型。另请参见QCompleter自定义完成规则
这还不是完整的公式解析和变量名完成,但是这是朝着这个目标合理的一步。它只是解释了如何使用QCompleter来实现这个目标。总之:子类化QCompleter并将所有自定义逻辑放入splitpath()中。

提出了一种更灵活的 QCompleter [QTBUG-7830] (https://bugreports.qt.io/browse/QTBUG-7830),但目前尚未实现。 - Trilarion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接