Документы 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.QCompleter.splitPath() по умолчанию разделяет PySide.QtGui.QCompleter.completionPrefix() с помощью QDir.separator(), если модель является PySide.QtGui.QFileSystemModel.
Чтобы обеспечить завершение, 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()