快速提问
是否有一种简单/快速的方法可以将QListWidget
或QStandardItemModel
(用于QListView
)项映射到我的应用程序逻辑?
完整问题
注意:我将不明确地使用
QListWidget
或QListView及其QStandardItemModel。从我目前对这个问题的看法来看,从一个切换到另一个是微不足道的。
我通常需要在HMI中有一个QListView
或等效项,它显示一些文本值,需要在选择/单击时做出反应。
在SLOT
中,为了执行所需的操作,需要标识行。Qt::DisplayRole
是不合适的,因为某些文本可能会重复,并且QStrings不是识别计算机科学数据的最佳方式。
// Click on a row
connect( &myView, &QListView::clicked,
[&myView, this]( const QModelIndex &idx)
{
// E.G. need to update the database for this row. Which row?
});
可能的解决方案:
- 维护一个
map
以从QModelIndex
行中检索 ID。 - 在模型行中保存任何ID,便于应用任何操作。
第一个选项很乏味:它需要连接模型以保持地图和模型同步。同样的逻辑一次又一次。
第二种选择似乎是迄今为止最好的:我保存(例如数据库 ID)并在之后使用它;但是,QListView
模型(据我所知)不包括这个非常友好和有用的ID。所以直到现在,我已经一次又一次地扩展了QListView
模型。
如何将 QModelIndex 映射回我的应用程序逻辑?我真的必须为这个简单的操作扩展模型吗?
相关问题:QTreeView:维护QModelIndex和底层数据之间的映射
手动创建QAbstractModel怎么样,这样您就可以完全控制QModelIndexes的创建方式,并且可以使用它来做一些事情。
我已经实现了数千个Qt模型,我从来不喜欢QStandardItemModel方法,因为我通常需要编写比我自己使用模型更多的样板文件。
- 从您的 QAbstractList/Table/TreeModel 继承
- 实现索引()
- 创建直接项目访问的方法
.
// Click on a row
connect( &myView, &QListView::clicked,
[&myView, this]( const QModelIndex &idx)
{
auto& myItem = idx.model()->directAccess(idx.row());
});
- 利润。