我想为 a 构建一个完成,QLineEdit
它可以采用多个完成模型并将它们组织为类别。
我有一个基于QSortFilterProxyModel
项目的树模型的工作解决方案:
模型中的根项显示为类别,每个根项的子项显示为过滤项。然后是自定义的QTreeView
,因此可以正确显示,选项卡忽略类别等。
这很好用——但是它使得编写新的完成变得非常困难(例如,对于设置的可能值)。
每个完成都需要是一个包含所有类别的树模型。我更喜欢为每个类别编写简单的列表模型,然后能够将它们组合成一个QTreeModel
,即类似这样的东西(伪 Python 代码):
commands = CommandListModel()
settings = SettingListModel()
completion.setModels([('commands', commands), ('settings', settings)])
我想到了一些不同的解决方案,但我不确定要走哪条路,因为所有这些解决方案都觉得实施起来并不简单:
- 编写一个
QAbstractProxyModel
类(或自定义模型),将几个列表模型组合成一个树模型,并保持视图部分不变。
然而,用 Python 编写自定义树模型很困难(如果你做错了什么,通常会出现段错误),而且我过去曾遇到过性能问题(与 a 相比QStandardItemModel
,因为基础模型中有几千个项目)。
- 为填充树模型的每个模型编写函数(给定一个类别和一个项目列表)。
这使得编写动态模型而不是仅仅拥有静态项目列表变得更加困难。
- 使用几个列表模型,并将视图调整
QVBoxLayout
为QListView
s 的 a。
到目前为止,这对我来说是最有希望的。但是,通过完成和过滤实现选项卡以使其正常工作也可能很麻烦,并且也要适当地调整子视图的大小。
有没有我没有考虑过的更简单的方法?哪种方法可能是最不痛苦的?