【问题标题】:Building A Custom QTreeView with objects using C++使用 C++ 构建带有对象的自定义 QTreeView
【发布时间】:2015-03-13 14:26:21
【问题描述】:

好的,所以我对这篇文章中包含的所有主题都有些陌生。 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)

我的问题是,我仍然需要能够完成另外 2 项任务,我似乎无法使用该示例(在发布的链接中)作为模板来完成这些任务。

我的代码几乎完全相同地模仿了链接中的示例!模型类迭代我的场景管理器成员向量,构造树项,并以与 SetupModelData 函数几乎相同的方式粗略地构建带有字符串的 TreeView。

这一切都很好,除了我需要做以下事情。

  1. 在树中选择一个项目,单击删除按钮
    • 完成此操作后,需要从树视图(及其子视图)中删除项目
    • 并且该项目需要从原始场景管理器中完全删除。
  2. 在树中选择一个项目,并能够向该对象添加一个适当的子项。
    • 需要在树视图中显示
    • 并且需要添加到场景管理器的适当位置

对于我的生活,我无法弄清楚如何做到这一点,我已经尝试了一系列想法,但我无法成功。解决这个问题的最佳方法是什么?

有没有什么方法可以从树视图中获取更多的 QVarient 字符串?是否可以获得指向创建树的实际树节点的指针?如果我能做到这一点,我可以只修改要创建的树节点,并使用指向创建它们的场景管理器对象的指针并操作路由的东西。

但是最好的方法是什么?我无法找到任何具体概述我想要完成的任务的内容。

提前感谢您的帮助!

【问题讨论】:

  • 您不是在构建视图,而是在构建模型
  • 确实感觉就像我在构建一个视图,我知道我不是,但是我的模型类总的来说感觉就像我构建了一个视图.....不过我知道你的意思!现在的诀窍是让它做我想让它做的一切。
  • 嗨,Shootin4Aces,如果您找到了解决方案,请将其添加为答案,不要将答案放入问题中。
  • 会的!没想到:)

标签: c++ qt qtreeview


【解决方案1】:

您使用的是什么树模型类?

我仍然无法发表评论:(这就是我在回答部分发布此评论的原因,希望你们不要介意。

基本上,您的 treemodel-item 类将需要支持删除和附加项目的函数。

例如

void ItemClass::insertChild(int row, itemClass *item){
    item->m_parent = this;
    m_children.insert(row, item);
}

所以如果你有一个项目,并且你想在第 5 行添加另一个项目,例如

item->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());
}

【讨论】:

  • 模型视图设置与此处提供的示例几乎相同:doc.qt.io/qt-5/qtwidgets-itemviews-simpletreemodel-example.html 我有一个树项目类和模型,基本上与此相同!我的模型继承自 QAbstractItemModel ...它与该示例基本相同
  • 提到的场景管理器类不在这两个类中
  • 好吧,尝试查看“可编辑树模型示例”,该示例可以在 Qt 的示例部分中找到。我认为它有你需要的一切
  • 有没有办法从树视图中获取更多的 QVarient 字符串?是否可以从当前选定的索引中获取指向创建树的实际树节点的指针??
  • @Shootin4Aces 所以基本上你想要一个指向当前在视图中选择的对象的指针?
【解决方案2】:

我确实设法完成了我需要做的事情,尽管我仍然坚信这不是最好的方法。欢迎提出更好的建议!

最终我修改了我的 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());        
}

我希望这对处于类似情况的其他人有所帮助,感谢您的想法和指导!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-21
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    相关资源
    最近更新 更多