如何将 QListWidget / QStandardItemModel 项映射到我的逻辑?

How to map the QListWidget / QStandardItemModel item to my logic?

本文关键字:我的 映射 QListWidget QStandardItemModel      更新时间:2023-10-16

快速提问

是否有一种简单/快速的方法可以将QListWidgetQStandardItemModel(用于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());
});
  • 利润。