Решение
Ответы @ rafix07 и @eyllanesc являются на 100% правильными и решают проблему, о которой вы спрашивали.
Однако я позволю себе предложить другое направление в вашем дизайне, потому что:
В случае, если вы представили, вам на самом деле не нужно создавать свою собственную структуру, т.е. BundleItem
и подкласс QStandardItem
в этом отношении.
QStandardItem
сам по себе обеспечивает достаточную функциональность для удовлетворения ваших потребностей. Просто используйте QStandardItem :: data и QStandardItem :: setData .
Примечание: Для вашего удобства вы можете создать enum
со значением каждой информации, например, использовать что-то вроде ItemTeam
вместо Qt::UserRole + 1
.
Пример
Вот пример, который я подготовил для вас, чтобы продемонстрировать предложенный мной подход:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class QStandardItem;
class MainWindow : public QMainWindow
{
enum DataType : int {
ItemName = Qt::DisplayRole,
ItemNickName = Qt::UserRole,
ItemTeam
};
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
QStandardItem *createItem(QString name, QString nickname, QString team);
private slots:
void onDoubleCLicked(const QModelIndex &index);
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "MainWindow.h"
#include <QStandardItem>
#include <QSortFilterProxyModel>
#include <QBoxLayout>
#include <QListView>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
auto *proxyModel = new QSortFilterProxyModel;
proxyModel->setSortCaseSensitivity(Qt::CaseInsensitive);
auto *widget = new QWidget(this);
auto *lay = new QVBoxLayout(widget);
auto *listview = new QListView();
auto *model = new QStandardItemModel();
proxyModel->setSourceModel(model);
listview->setModel(proxyModel);
// add Item to list
model->appendRow(createItem("Kevin", "Kev", "Coyotes"));
model->appendRow(createItem("Michael", "Mike", "Walkers"));
lay->addWidget(listview);
setCentralWidget(widget);
connect(listview, &QListView::doubleClicked, this, &MainWindow::onDoubleCLicked);
}
QStandardItem *MainWindow::createItem(QString name, QString nickname, QString team)
{
auto *item = new QStandardItem(name);
item->setData(nickname, ItemNickName);
item->setData(team, ItemTeam);
return item;
}
void MainWindow::onDoubleCLicked(const QModelIndex &index)
{
if (index.isValid())
qDebug() << index.data(ItemName).toString() << index.data(ItemNickName).toString() << index.data(ItemTeam).toString();
}