c++ - Qt - QVector 和模型视图 - 从 listView 获取自定义类的最佳方法是什么?
问题描述
我有一个名为 的自定义类Foo
,并将此类的实例存储在向量中:
class Foo{
public:
QString name;
int second_property;
}
//...
QVector<Foo> foos = {test1, test2, test3};
我想在 中显示name
属性listView
,所以我创建了一个模型,然后用名称填充它:
in .h
QStandardItemModel model;
QStandardItem* root;
QStandardItem* item;
in .cpp
root = model.invisibleRootItem();
ui->listView->setModel(&model);
foreach(Foo foo, foos){
item = new QStandardItem(foo.name);
root->appendRow(item);
}
现在,在我单击 UI 中的项目后,我想访问整个Foo
类,以及它的属性和方法,所以我使用循环来查找我的对象:
void MainWindow::on_listView_clicked(const QModelIndex &index)
{
foreach(Foo foo, foos){
if(foo.name==index.data().toString()){
qDebug()<<"You found the object! Second property: " + foo.second_property);
}
}
}
它确实有效,但我觉得这不是非常理想的做法(如果两个对象有相同的name
呢?)
===============
这个问题有更好的解决方案吗?我可以在这段代码中抛弃 QVector 或 Model/View listView 或其他任何愚蠢的东西。
TL;DR:
基本上,我希望在(或)QString name
中显示对象()的一个属性,并且在单击它之后,我想访问其类的每个属性和方法。listView
listWidget
===============
编辑:
所以我使用QAbstractListModel制作了自己的模型:
class myOwnModel : public QAbstractListModel
{
Q_OBJECT
public:
myOwnModel(const QStringList &strings={""}, QObject *parent = nullptr);
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role) const override;
Qt::ItemFlags flags(const QModelIndex &index) const;
bool setData(const QModelIndex &index, const QVariant &value,
int role = Qt::EditRole);
bool insertRows(int position, int rows, const QModelIndex &index = QModelIndex());
private:
QStringList stringList;
};
我仍然使用循环来填充这个模型的QVector<Foo> foos
name
属性:
myOwnModel* myModel = new myOwnModel();
for(int row=0; row<foos.size(); row++){
myModel->insertRows(row,1);
QModelIndex index = myModel->index(row,0);
myModel->setData(index,foos[row].name);
}
ui->view->setModel(myModel);
然后我仍然使用循环来获取所需对象的第二个属性:
void MainWindow::on_view_clicked(const QModelIndex &index)
{
for(int i=0;i<foos.size();i++){
if(index.data().toString()==foos[i].name){
qDebug() << "You found " << foos[i].name + " and the second property is " << foos[i].second_property;
}
}
}
我正在复制数据,就像之前使用QStandartItemModel一样,对吧?正如Konstantin T
所说,
我尝试使用QAbstractListModel,但我认为我对模型的理解不够好并以正确的方式使用它......
解决方案
使用QStandardItemModel几乎总是一个坏主意。您正在QVector和 Model 中复制数据。保持数据一致变得非常困难。
在您的情况下,更好的方法是改用QAbstractListModel。
推荐阅读
- java - 异常说明:xxx 使用非实体 xx 作为关系属性中的目标实体 [方法 xxx]
- r - 通过 data.table 中的可变间隔计算股票的回报
- android - 类似于单选按钮的按钮交互的良好代码设计是什么?
- r - 在 ggplot 版本 3+ 中反转日期时间(POSIXct 数据)轴
- java - 无法使用 PHP-Java Bridge 从 php 运行 java 类
- python - 不同长度的两个数据帧的列之间的余弦相似度?
- scala - 如何在 Scala 中将多个 case 表达式链接在一起
- javascript - 如何单击 selenium webdriver 中的剑道下拉菜单?
- xpath - XPath 从嵌套的 Div 中提取特定文本
- php - 网络服务 SOAP 中的参数