2

PySide 文档在QCompleter 中包含此部分和树模型

PySide.QtGui.QCompleter 可以在树模型中查找完成,假设任何项目(或子项目或子子项目)可以通过指定项目的路径明确表示为字符串。然后一次完成一个级别。

让我们以用户键入文件系统路径为例。该模型是(分层) PySide.QtGui.QFileSystemModel 。路径中的每个元素都会完成。例如,如果当前文本是 C:\Wind ,则 PySide.QtGui.QCompleter 可能会建议 Windows 完成当前路径元素。同样,如果当前文本是 C:\Windows\Sy , PySide.QtGui.QCompleter 可能会建议 System 。

为了使这种补全工作,PySide.QtGui.QCompleter 需要能够将路径拆分为在每个级别匹配的字符串列表。对于 C:\Windows\Sy ,需要拆分为“C:”、“Windows”和“Sy”。如果模型是 PySide.QtGui.QFileSystemModel ,则 PySide.QtGui.QCompleter.splitPath() 的默认实现使用 QDir.separator() 拆分 PySide.QtGui.QCompleter.completionPrefix() 。

为了提供完成,PySide.QtGui.QCompleter 需要知道索引的路径。这是由 PySide.QtGui.QCompleter.pathFromIndex() 提供的。PySide.QtGui.QCompleter.pathFromIndex() 的默认实现,返回列表模型的编辑角色的数据,如果模式是 PySide.QtGui.QFileSystemModel,则返回绝对文件路径。

但我似乎找不到一个例子来说明如何做到这一点。谁能指出我可以用作起点的示例?(在我的调查中,看起来困难的部分可能是树模型而不是 QCompleter)

看起来您需要提供以下功能:

  • 将字符串拆分为段的能力(对于给出的示例C:\Windows\Sy['C:','Windows','Sy']
  • 能够指定包含最后一段的项目列表(例如,包含在['C:','Windows']

我找到了 QCompleter 基本功能的示例,并且能够很好地调整基本功能(见下文),我只是不知道如何实现树模型类型的应用程序。

'''based on
http://codeprogress.com/python/libraries/pyqt/showPyQTExample.php?index=403&key=QCompleterQLineEdit'''

from PySide.QtGui import * 
from PySide.QtCore import * 
import sys

def main():    
    app     = QApplication(sys.argv)
    edit     = QLineEdit()
    strList     = '''
Germany;Russia;France;
french fries;frizzy hair;fennel;fuzzball
frayed;fickle;Frobozz;fear;framing;frames
Franco-American;Frames;fancy;fire;frozen yogurt
football;fnord;foul;fowl;foo;bar;baz;quux
family;Fozzie Bear;flinch;fizzy;famous;fellow
friend;fog;foil;far;flower;flour;Florida
'''.replace('\n',';').split(";")
    strList.sort(key=lambda s: s.lower())
    completer     = QCompleter(strList,edit)
    completer.setCaseSensitivity(Qt.CaseInsensitive)

    edit.setWindowTitle("PySide QLineEdit Auto Complete")    
    edit.setCompleter(completer)
    edit.show()

    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
4

2 回答 2

7

我找不到我想要的好例子,但我想出了如何使 Qt TreeModel 示例适应使用 QCompleter:

https://gist.github.com/jason-s/9dcef741288b6509d362

在此处输入图像描述

QCompleter 是最简单的部分,您只需告诉它如何将路径拆分为段,然后如何从模型中的特定条目返回路径:

class MyCompleter(QtGui.QCompleter):
    def splitPath(self, path):
        return path.split('/')
    def pathFromIndex(self, index):
        result = []
        while index.isValid():
            result = [self.model().data(index, QtCore.Qt.DisplayRole)] + result
            index = index.parent()
        r = '/'.join(result)
        return r

除此之外,您必须正确配置 QCompleter,告诉它如何从模型项获取文本字符串。在这里,我将其设置为使用 DisplayRole 并使用第 0 列。

edit     = QtGui.QLineEdit()
completer     = MyCompleter(edit)
completer.setModel(model)
completer.setCompletionColumn(0)
completer.setCompletionRole(QtCore.Qt.DisplayRole)
completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive)    
于 2014-07-13T00:19:29.653 回答
1

正如QCompleter的文档所述,您可以提供两种模型:列表模型或树模型。

列表模型的示例,在您的示例之后:

from PySide import QtGui

app = QtGui.QApplication([])

edit = QtGui.QLineEdit()
strList = "Germany;Russia;France;Norway".split(";")
completer = QtGui.QCompleter(strList)
edit.setCompleter(completer)
edit.show()

app.exec_()

作品:

在此处输入图像描述

作为树模型:

from PySide import QtGui, QtCore

app = QtGui.QApplication([])

edit = QtGui.QLineEdit()
model = QtGui.QFileSystemModel()
model.setFilter(QtCore.QDir.AllDirs | QtCore.QDir.Drives)
model.setRootPath('')
completer = QtGui.QCompleter(model, edit)
edit.setCompleter(completer)
edit.show()

app.exec_()

由于某种奇怪的原因,这里没有显示任何内容。稍后会调查。

于 2014-07-11T14:11:32.700 回答