繁体   English   中英

在QStandardItemModel / QTreeView中处理数据?

[英]Manipulating data in a QStandardItemModel/QTreeView?

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

从数据文件读取并将其解析为模型I(相信),我可以做的很好。 但是,用户需要能够在QTreeView中编辑/操作模型。 这包括添加和删​​除项目 这似乎很简单,但是与该项目关联的某些数据未显示在QTreeView中。 有点...“隐藏”,直到用户尝试对其进行编辑。 用户需要双击一个项目以打开一个对话框,在其中可以编辑大量其他参数和数据(就像很长的字符串和内容,我不能只在QTreeView中显示这些内容)。

我在寻找一种方法来存储与树中每个项目有关的所有“额外数据”时遇到了很大的困难。 最初,人们会想到各种各样的QVector,但是在操纵模型的同时还要操纵QVector是我无法解决的技术。

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

有任何想法吗? 如有任何疑问,请随时提出。 我可以根据您的需要进行澄清。 :) 谢谢你的时间。

答案是肯定的,您可以存储其他数据。 您需要将setData()设置为特定的user role + 1 例如:

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

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

QVariant 可以使用 QListQStringList QList 容器 ,因此您也可以使用容器。 例如:

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”)))

暂无
暂无

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

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