将一些自定义数据添加到Qt树模型

时间:2009-06-04 08:20:16

标签: c++ qt treeview model

我在Qt中使用模型/视图范例是一个菜鸟并且有以下问题:我有一个树状结构,必须通过Qt可视化。我发现,QAbstractTableModel非常适合我的需求,所以我写了以下内容:

class columnViewModel : public QAbstractTableModel {
   // some stuff...
};

现在一切正常,但现在我必须在树的节点上实现“观察者”设计模式。每当节点在TreeView中扩展时,我必须将Observer添加到相应的节点。每当节点崩溃时,我必须从节点中删除此Observer。所以,我写了一些东西,比如:

void onExpand( const QModelIndex & Index ... ) {
   Node* myNode = static_cast<Node*>(Index->internalPointer());
   Observer* foo = Observer::create();
   myNode->addObserver(foo);

   // ok up to here, but now where can I save this Observer? I must associate 
   // it with the Node, but I cannot change the Node class. Is there any way 
   // to save it within the index?
}

void onCollapse( const QModelIndex & Index ... ) {
   Node* myNode = static_cast<Node*>Index->internalPointer();
   Observer* foo = // well, what should I write here? Node does not have anything 
                   // like "getObserver()"! Can I extract an Observer from Index?

   myNode->remObserver( foo );
}

我现在没有这些片段,所以代码可能不是有效的Qt,但问题似乎很清楚。我既不能改变Node也不能改变Observer类。我可以有一个Observers的内部列表,但后来我必须解决,从特定节点删除什么Observer。有没有办法将Observer指针保存在Index(某些用户数据可能)中,以便在onCollapse中快速解决?任何想法都会受到欢迎......

1 个答案:

答案 0 :(得分:7)

执行以下操作:

  • 定义一个新角色(类似于Qt :: UserRole),比方说ObserverRole。
  • 使用QAbstractItemModel :: setData 将观察者设置为数据 观察员角色。代码草图:

    this-&gt; model() - &gt; setData(ObserverRole,QVariant :: fromValue(foo));

  • 您可能需要在cpp实现文件中添加元数据声明,例如

    Q__DECLARE __METATYPE(Observer *);

允许QVariant以适当的方式进行变体转换。

  • 您可以使用带有Observer角色的QModelIndex :: data获取索引的观察者:

    index.data(ObserverRole);

  • 在您的模型实现中,添加对Observer角色返回数据的支持(如果有的话)(正如您可能对Qt :: UserRole或Qt :: DisplayRole所做的那样。

收到评论的更新:

通常,QModelIndex :: data为查看器提供数据。在请求数据时指定的角色允许模型的定制器根据不同的原因提供不同的数据(例如,为显示角色提供字符串 - >项目的标题)。

如果您不使用此机制来获取数据,那么您可能不需要QTreeView。在这种情况下,使用QTreeWidget,您可以直接使用QTreeWidgetItems并通过setData方法将数据附加到项目,或者子类化QTreeWidgetItem并将数据添加为该子类的成员。

当您想要使用模型时,通常会使用视图。