1

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

从数据文件中读取并将其解析为我(相信)我可以做得很好的模型。然而,用户需要能够从 QTreeView 中编辑/操作模型。这包括添加和删除项目。这看起来很简单,但是,与该项目关联的一些数据不会显示在 QTreeView 中。在用户尝试编辑它之前,它有点……“隐藏”。用户需要双击一个项目来打开一个对话框,他们可以在其中编辑一大堆其他参数和数据(就像很长的字符串和东西,我不能只在 QTreeView 中显示的东西)。

我在试图找到一种方法来存储与树中每个项目有关的所有“额外数据”时遇到了很大的困难。最初,脑海中会浮现出各种各样的 QVector,但是在操纵模型的同时也操纵 QVector 是一种我无法理解的技术。

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

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

4

1 回答 1

5

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

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

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

QVariant 可以使用QListor之类的容器QStringList,所以你也可以使用容器。例如:

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

于 2014-12-23T05:54:27.623 回答