在QStandardItemModel / QTreeView中操作数据?

时间:2014-12-23 04:30:53

标签: c++ qt qtreeview qstandarditemmodel

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

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

我在尝试找到存储所有"额外数据的方法时遇到了很大的困难。属于树中的每个项目。最初,一个QVector的种类浮现在脑海中,然而操纵模型同时操纵QVector是一种我无法绕过头脑的技术。

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

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

1 个答案:

答案 0 :(得分: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,“三”))