【问题标题】:How to get selected items from a QListView which uses custom QAbstractListModel in C++如何从使用 C++ 中的自定义 QAbstractListModel 的 QListView 中获取所选项目
【发布时间】:2020-07-08 01:41:57
【问题描述】:

我按照本指南Creating a cusotm model for a QListView 创建了一个自定义列表模型。我可以显示自定义对象列表(例如示例中的 Employee),但我不知道如何取回所选对象(我可以直接取回“链接”对象吗?)。

也许我必须用这个命令做点什么:

myLV->selectionModel()->selectedIndexes();

但我真的不知道如何取回原始自定义对象。

[编辑]

到目前为止,我已经解决了在我的自定义列表模型中添加自定义方法来检索对象:

Employee* MyEmployeeListModel::getAtSelectedIndex(const QModelIndex& index){
    return employees_.at(index.row());
}

然后在主窗口调用这个:

QModelIndexList selectedRows;
QItemSelectionModel * selmodel = ui->employeesLV->selectionModel();
selectedRows = selmodel->selectedRows();

MyEmployeeListModel* currModel = dynamic_cast <MyEmployeeListModel*>(ui->employeesLV->model());

for (const QModelIndex & index : selectedRows){
    Employee* item=currModel->getAtSelectedIndex(index);
    if (item) {
        // do something with the item
    }
}

现在我想知道这是否是真正的最佳实践。

【问题讨论】:

  • 你能给那些对象举个例子吗?您可以通过自定义角色或整个对象传递一个 id。 (需要 Q_DECLARE_METATYPE/qRegisterMetatype())
  • 考虑一个带有 id、name 和 surname 的简单员工类。在列表中,我的代码与我链接的示例完全相同。列表显示姓氏。 When selected a list of employees, I would liek to retrieve back the whole information for each selected employee.

标签: c++ list qt mvvm model


【解决方案1】:

我将以下代码与 QTreeView (ui->treeMessages) 一起使用,但这也适用于 QListView:

            QModelIndexList selectedRows;
            QItemSelectionModel * selmodel = ui->treeMessages->selectionModel();
            selectedRows = selmodel->selectedRows();

            for (const QModelIndex & index : selectedRows)
            {
                const QModelIndex sourceIndex = m_sortFilterModel->mapToSource(index);
                ItemData * item = sourceIndex.internalPointer();
                if (item) { 
                    // do something
                }

            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多