首页 文章

在QStandardItemModel / QTreeView中操作数据?

提问于
浏览
0

在我的项目中,我解析一个NBT数据文件,并根据该文件创建一个QStandardItemModel,然后在QTreeView中显示该文件 . 模型创建得很好,我知道如何在创建时为每个QStandardItem设置某些参数 . 例如,我知道如何设置显示文本和图标 . 有没有办法可以创建“自定义容器”来存储每个项目中的“额外”数据?

从数据文件读取并将其解析为模型我(相信)我可以做得很好 . 但是,用户需要能够在QTreeView中编辑/操作模型 . 这包括 adding and removing items . 这似乎很简单但是,与该项相关的一些数据不会显示在QTreeView中 . 它's kinda... 2817385 until the user tries to edit it. The user needs to double-click on an item to bring up a dialog where they can edit a whole bunch of other parameters and data (Like really long strings and stuff, stuff I can'只是在QTreeView中显示 .

我在寻找一种方法来存储与树中每个项目相关的所有“额外数据”时遇到了很大的困难 . 最初,一个QVector的种类浮现在脑海中,然而操纵模型同时也操纵QVector是一种我无法绕过头脑的技术 .

更糟糕的是,用户需要能够在不同的数据文件(也称为模型)之间切换,同时仍保留对先前数据文件所做的任何编辑 .

有任何想法吗?如果您有任何疑问,请不要犹豫 . 我可以尽可能多地澄清 . :) 谢谢你的时间 .

1 回答

  • 3

    答案是肯定的,您可以存储其他数据 . 你需要 setData() 到具体的 user role + 1 . 例如:

    view->model()->setData(someIndex,"New Data", Qt::UserRole + 1);
    

    要获取此数据,请使用 data() 方法和相同的角色 . 要进行编辑,您还可以尝试使用自定义对话框或自定义委托 .

    QVariant can use containers,例如 QListQStringList ,因此您也可以使用容器 . 例如:

    auto in = ui->tableView->model()->index(0,0);
    QList<QVariant> lst;
    lst << "one" << "two" << "three";
    view->model()->setData(in,QVariant(lst),Qt::UserRole+1);
    //...
    qDebug() << "output:"<<view->model()->data(in,Qt::UserRole+1).toList();
    

    输出:

    输出:(QVariant(QString,“one”),QVariant(QString,“two”),QVariant(QString,“three”))

相关问题