【问题标题】:QCompleter on QLineEdit for parts of the inserted textQLineEdit 上的 QCompleter 用于插入的部分文本
【发布时间】:2015-01-21 13:54:21
【问题描述】:

我创建了一个QLineEdit 来阅读中缀数学表达式。运算符仅限于+-*/ 和方括号。值可以是数字或表示数值的变量名称。我想自动完成变量名。

问题在于看似简单的QComplete 仅适用于单个预定义的单词/短语。它们在其他词之间不起作用(正如您在修改表达式时可能期望的那样)。

我尝试阅读 Tree Model Completer,但由于我使用 Python 进行编程,这对我没有太大帮助。有人知道用 python 编码的简单树模型完成器示例吗?

【问题讨论】:

  • 所以您想自动完成先前在表达式中输入但未预定义的变量名称?如果是这样,那么只需即时提取相关的变量名称,然后从中填充完成者。大多数高级文本编辑器都具有此功能:通常称为“从文档自动完成”等。
  • 变量名已经定义好了。我只是在 PyQt 中寻找树模型完成器的示例代码。
  • @ekhumoro 这行不通,因为完成者检查了已经输入的整个文本,它不知道什么是变量名以及公式的其余部分是什么。
  • 在这里使用树模型完成器对您没有多大帮助。您需要在任何给定点解析公式以找出当前变量名存根是什么,然后仅在该部分上调用某种 Completer 并完成它。
  • @Trilarion。我想我明白现在的困惑是什么了。当 OP 说QCompleter 时,它们实际上是指QLineEdit 使用的标准完成机制。但是QCompleter 类本身比这灵活得多。对于自定义自动完成器,有必要使用QCompleter.setWidget() 并实现您自己的完成机制。但是,正如您所说,不需要树模型 - 只需简单的“从文档自动完成”即可。

标签: python qt pyqt qlineedit qcompleter


【解决方案1】:

在阅读了 ekhumoros comment 之后,我决定为自定义完成者制作一个简短的示例。

示例如下:

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”继续。例如,它看起来像:

所有工作都在QCompletersplitPath(path) 中完成,每次我更改编辑字段的文本时都会调用两次(?)。在对文本进行一些处理之后,应该使用包含一个或多个提案的简单字符串列表来设置新模型。似乎每次都必须重新设置模型。另见QCompleter Custom Completion Rules

这还不是完整的公式解析和变量名完成,而是朝着这个方向迈出的合理一步。它只是解释了如何将QCompleter 用于该目标。总结一下:子类QCompleter 并将所有自定义逻辑放入splitpath()

【讨论】:

  • 提出了一个更灵活的 QCompleter QTBUG-7830,但到目前为止还没有实现。
猜你喜欢
  • 2016-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
相关资源
最近更新 更多