【问题标题】:How to map the QListWidget / QStandardItemModel item to my logic?如何将 QListWidget / QStandardItemModel 项目映射到我的逻辑?
【发布时间】:2017-04-12 11:14:11
【问题描述】:

快速提问

是否有一种简单/快速的方法可以将 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: maintaining mapping between QModelIndex and underlying data

【问题讨论】:

    标签: c++ qt qtreeview qabstractitemmodel qtwidgets


    【解决方案1】:

    手动创建 QAbstractModel 怎么样,这样您就可以完全控制如何创建 QModelIndexes,并且可以使用它来做一些事情。

    我已经实现了数千个 Qt 模型,但我从不喜欢 QStandardItemModel 方法,因为我通常需要编写比我自己使用模型更多的样板。

    • 从您的 QAbstractList/Table/TreeModel 继承
    • 实现 index()
    • 创建直接访问项目的方法

    .

    // Click on a row
    connect( &myView, &QListView::clicked, 
    [&myView, this]( const QModelIndex &idx)
    {
       auto& myItem = idx.model()->directAccess(idx.row());
    });
    
    • 利润。

    【讨论】:

    • 是的,这就是我正在做的事情(“所以直到现在我已经一次又一次地扩展了 QListView 的模型”)。我想知道是否有预定义的role、一些隐藏的行为或其他任何阻止我实现这个 QAbstractItemModel 的东西,所以我可以重用所有正常的 QStandardItemModel 东西。
    • 我创建了一个包含 QList 的 QObjectListModel,并且我在任何地方都使用它,使用 Q_PROPERTIES 来填充表格上的内容(每个属性一列)。
    • 当然,如果没有更简单的方法,我将不得不创建/维护一个具有类似行为的模型。可能是一些模板模型,所以内容很容易设置。
    • 模板不起作用 - 毕竟它是一个 QObject。 moc 需要在其上运行。我会选择 QVariantModel 或 QObjectModel,它很容易处理 QObject 指针。
    • 这里有一个很好的回应:stackoverflow.com/questions/4238204/…
    猜你喜欢
    • 1970-01-01
    • 2016-03-08
    • 2018-06-06
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 2014-07-16
    • 2018-01-07
    相关资源
    最近更新 更多