当我同时使用自己的QCompleter和QAbstractItemModel时,我在PySide中看到了一种奇怪的行为,但我在PySide(或Qt(中找不到解释它在做什么的文档。
当我有一个使用 QCompleter 的编辑框,并且我键入其他字符时,有大量的调用需要QAbstractItemModel.data()
以获取大量项目的完成列内容。此调用针对相关项发生,对每个项进行多次调用,对紧邻根目录的每个顶级项也会发生多次调用。
由于我的数据模型包含数百(甚至可能数千(个顶级项目,我有点担心我做错了什么。我只是想确保它不会让我的计算机陷入不相关的计算
。我在这里创建了一个示例:https://gist.github.com/jason-s/6c9495e29a4caac7ddf5cd739550a310 我基于我之前在另一个问题中的例子
如果我按python qtcompleter5.py -e 25
运行它并在编辑框中键入United States/Arizona/P
,则我在控制台中看到的内容如下所示。(Miragi012stan
条目是有意为之的,通过改变-e
参数轻松改变顶级项目计数。
splitPath: [u'United States', u'Arizona', u'P']
Canada
France
Germany
United States
Mexico
Miragi000stan
Miragi001stan
Miragi002stan
Miragi003stan
Miragi004stan
Miragi005stan
Miragi006stan
Miragi007stan
Miragi008stan
Miragi009stan
Miragi010stan
Miragi011stan
Miragi012stan
Miragi013stan
Miragi014stan
Miragi015stan
Miragi016stan
Miragi017stan
Miragi018stan
Miragi019stan
Miragi020stan
Miragi021stan
Miragi022stan
Miragi023stan
Miragi024stan
Peoria
Peoria
Phoenix
Peoria
Peoria
Peoria
Peoria
Phoenix
Phoenix
在我看来,.data()
正在为所有顶级项目调用,然后为可能与完成窗口中的文本匹配的实际项目调用 3-6 次。
它唯一不这样做的情况是当我输入顶级项目时,例如 生成这些调用Unite
:
splitPath: [u'Unite']
United States
United States
United States
splitPath: [u'Unite']
United States
United States
United States
United States
United States
(顺便说一下,我可以注释掉 TreeView 的东西,只留下 QLineEdit,所以 TreeView 不是导致问题的部分。
即使我试图通过使用completer.setModelSorting(QtGui.QCompleter.CaseInsensitivelySortedModel)
告诉 PySide 我正在使用排序模型(请参阅 qtcompleter5a.py(来提供帮助,也会发生相同的行为(查询所有顶级项目(
这是怎么回事?
嗯...我不知道这是否是一个好主意,但是如果我将所有顶级节点放在一个虚拟节点下,那么只有虚拟节点在完成过程中会得到一个"无用"的查询。
见 https://gist.github.com/jason-s/6c9495e29a4caac7ddf5cd739550a310#file-qtcompleter5b-py
我从 qtcompleter5.py 所做的更改:
- 标头项是单独的项,不用作根
- 虚拟节点返回
""
中完成列的内容DisplayRole
- QCompleter.splitPath 返回的路径前面有一个额外的虚拟组件
- 如果
pathFromIndex()
的第一个组件是根节点,则忽略
它 - 在 AbstractItemModel 中:
rowCount()
为无效的父级返回 1- 当提供的索引位于根目录时(以前是索引的父级位于根目录时(,
parent()
返回无效QtCore.QModelIndex()
- 当提供的父项无效时,
index()
返回根项(以前它查找根项的相应子项(
这使得这个模型的 TreeView 看起来有点滑稽,但对于不需要 TreeView 的应用程序,它似乎工作正常;如果我输入United States/Arizona/P
,那么它会打印:
splitPath: ['', u'United States', u'Arizona', u'P']
Peoria
Peoria
Phoenix
Peoria
Peoria
Peoria
Peoria
Phoenix
Phoenix