繁体   English   中英

Qt - QVector 和模型视图 - 从 listView 获取自定义类的最佳方法是什么?

[英]Qt - QVector and Model View - what's the best way to get a custom class from a listView?

我有一个名为Foo的自定义类,我将这个类的实例存储在一个向量中:

    class Foo{
    public:
       QString name;
       int second_property;
    }
    //...
    QVector<Foo> foos = {test1, test2, test3};

我想在listView显示name属性,所以我创建了一个模型,然后用名称填充它:

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 或模型/视图 listView 或其他任何愚蠢的东西。


特尔;博士:
基本上,我想在listView (或listWidget )中显示一个对象( QString name )的一个属性,在我点击它之后,我想访问它的类的每个属性和方法。

==============
编辑:

所以我使用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和模型中的数据。 保持数据一致变得非常困难。

在您的情况下,更好的方法是改用QAbstractListModel

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM