好的,所以我对这篇文章中包含的所有主题都是一个菜鸟。 C ++新手,Qt新手。话虽如此,我已经对这个问题进行了大量的阅读,并且已经在这方面工作了一段时间。也许我并没有正确地绕过这个问题,或许我的方向完全错误。请帮助并告诉我如何处理这个问题!
我正在构建一个基于以下类结构的QtreeView :(仅显示重要成员)
Class ScenarioManager // singleton
{
Qvector<object_A*> *AllObjectA's
}
Class Object_A
{
QString name
Qvector<double> numSet // 3 values inside
Qvector<double> numSet2 // 2 values inside.
QString type
Qvector<Object_B*> AllObjectB's //Object_B is an interface class with
//purely virtual functions
}
Class Object_C : Object_B
{
QString name
bool isTypeObjectC
Object_F* exact
}
Class Object_D : Object_B
{
String name
bool isTypeObjectC
Object_F* min
Object_F* max
QVector<Object_F*> AllObjectF's // setOfAllMins/Maxes that subdivide the
// region between min and max.
}
Class Object_F
{
double value
}
我已经按照示例创建了可在此处找到的树视图: http://doc.qt.io/qt-5/qtwidgets-itemviews-simpletreemodel-example.html
并成功制作了我想要的视图,如下所示:
|__name__|__type__|__f-range__|__allobjectf_| // header data
|
|Object_A1-name __Object_A1_Type // under name and type fields
| |
| AllObjectC's // under name
| | |
| | Object_C1_name // under name
| | Object_C2_name
| | |______exact.value // under f-range
| AllObjectD's
| |
| Object_D1_name
| Object_D2_name
| |_____min.value '-' max.value // under f-range
| |__AllObjectF[0].min '-' AllObjectF[0].max//under allObjF
| |__AllObjectF[1].min '-' AllObjectF[1].max
| |__AllObjectF[2].min '-' AllObjectF[2].max
|
|Object_A2-name __Object_A2_Type....(repeat)
我的问题是,我仍然需要完成另外两项任务,这些任务在我的生命中似乎无法使用该示例(在发布的链接中)作为模板完成。
我的代码几乎完全模仿链接中的示例!模型类遍历我的scenariomanager成员向量,构造树项,而是使用与SetupModelData函数几乎相同的方式粗略地构建TreeView。
这一切都很好,除了我需要做以下几点。
对于我的生活,我无法弄清楚如何做到这一点,我已经尝试了一系列想法但我却未能成功。什么是最好的方法呢?
有没有办法从树视图中获得更多QVarient Strings?是否有可能获得指向创建树的实际树节点的指针?如果我能做到这一点,我可以修改要创建的树节点,使用指向创建它们的场景管理器对象的指针并操纵路由的东西。
但是最好的方法是什么?我无法找到任何具体概述我想要完成的事情。
提前感谢您的帮助!
答案 0 :(得分:0)
你在使用什么树模型课?
我仍然无法评论:(这就是为什么我在回答部分发表此评论,希望你们不要介意。
基本上,你的treemodel-item类需要该函数来支持删除和追加项目。
例如
void ItemClass::insertChild(int row, itemClass *item){
item->m_parent = this;
m_children.insert(row, item);
}
所以,如果你有一个项目,并且你想在第5行添加另一个项目,那么
item-&gt; insertChild(5,anotherItem)
函数中的第一行将使item成为anotherItem的父项,然后它会将anotherItem添加到第5行中item的子项列表中
获取指向当前所选项目的指针:
QVariant TreeModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (role != Qt::DisplayRole && role != Qt::EditRole)
return QVariant();
TreeItem *item = getItem(index);
pointervariable = item; <<== pointervariable is inside your modelclass
return item->data(index.column());
}
答案 1 :(得分:0)
我确实设法完成了我需要的东西,尽管我仍然相信它不是最好的方法。欢迎提出更好的建议!!
最终我修改了我的treenode类以拥有一个成员字段:
QObject* dataSource;
在为每个树项创建模型期间设置此指针。然后,您可以通过类似
的方法访问创建模型的原始数据源QModelIndex anIndex = ui->treeView->currentIndex();
if(anIndex.isValid())
{
STreeItem *item = static_cast<STreeItem*>(anIndex.internalPointer());
ObjectType* obj = static_cast<ObjectType*>(item->getDataSourcePointer());
}
我希望这可以帮助处于类似情况的其他人,感谢您的想法和指导!