QCompleter和qabstractemmodel如何在PySide中工作?

2024-10-01 02:32:38 发布

您现在位置:Python中文网/ 问答频道 /正文

当我同时使用我自己的QCompleterQAbstractItemModel时,我在PySide中看到了一个奇怪的行为,我在PySide(或Qt)中找不到解释它所做事情的文档。你知道吗

当我有一个使用QCompleter的编辑框,并且输入额外的字符时,会有大量的调用^{}来获取一大堆项目的完成列内容。此调用针对相关的项,对每个项执行多次,但也针对根目录下的每个顶级项执行。你知道吗

由于我的数据模型中有成百上千的顶级项,我有点担心我做错了什么。我只想确保我的电脑不会因为不相关的计算而陷入困境。你知道吗

我在这里创建了一个示例:https://gist.github.com/jason-s/6c9495e29a4caac7ddf5cd739550a310 我基于my earlier example in another question

如果我将它作为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不是导致问题的部分。)

即使我试图通过告诉PySide我正在使用排序模型(参见qtcompleter5a.py)和使用^{}来提供帮助,也会发生相同的行为(查询所有顶级项)

这是怎么回事?你知道吗


Tags: py内容顶级unitedunitepysidetreeviewstates
1条回答
网友
1楼 · 发布于 2024-10-01 02:32:38

嗯。。。我不知道这是不是一个好主意,但是如果我把所有顶级节点放在一个虚拟节点下,那么在完成过程中只有虚拟节点得到一个“无用”的查询。你知道吗

https://gist.github.com/jason-s/6c9495e29a4caac7ddf5cd739550a310#file-qtcompleter5b-py

我对qtcompleter5.py所做的更改:

  • 标题项是一个单独的项,不用作根
  • 虚拟节点返回""中完成列的内容DisplayRole
  • 返回的路径QCompleter.splitPath文件前面有一个额外的虚拟组件
  • 如果是根节点,pathFromIndex()的第一个组件将被忽略
  • 在AbstractItemModel中:
    • rowCount()为无效的父级返回1
    • parent()在提供的索引位于根目录时返回无效的QtCore.QModelIndex()(以前是在索引的父目录位于根目录时)
    • index()在提供的父项无效时返回根项(以前它查找根项的适当子项)

这使得这个模型的树视图看起来有点滑稽,但是对于不需要树视图的应用程序,它似乎可以工作;如果我输入United States/Arizona/P,那么它会打印:

splitPath:  ['', u'United States', u'Arizona', u'P']

Peoria
Peoria
Phoenix
Peoria
Peoria
Peoria
Peoria
Phoenix
Phoenix

相关问题 更多 >