c++ - 向 Qt 树模型中添加一些自定义数据

标签 c++ qt treeview model

我是一个在 Qt 中使用模型/ View 范例的菜鸟,并且有以下问题:我有一个树状结构,必须通过 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 类。我可以有一个观察者的内部列表,但是我必须解决,从特定节点中删除什么观察者。有什么方法可以将 Observer 指针保存在 Index 中(可能是一些用户数据),以便在 onCollapse 中快速解决它?欢迎任何想法...

最佳答案

执行以下操作:

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

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

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

    Q__DECLARE __METATYPE(观察者*);

允许 QVariant 以正确的方式进行变体转换。

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

    index.data(观察者角色);

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

收到评论的更新:

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

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

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

关于c++ - 向 Qt 树模型中添加一些自定义数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/949222/

相关文章:

c++ - template-name<TT> 是推导的上下文吗?

c++ - 如何检查两个指针​​是否指向同一个对象?

c++ - C++程序编译,运行但崩溃(无错误消息)

Qt、qmake、pro 文件 : Add compiler name to target name

php - SPARQL 查询以获取节点的所有父节点

c# - 如何禁用 TreeView 自动第一个节点选择

c++ - 从非成员静态函数发出信号

qt - 带圆角的 QDialog 有黑角而不是半透明的

qt - 如何在 Qt-Designer 中使用自定义小部件

c# - 如何将一个 TreeView 实例的节点添加到同一 TreeView 的另一个实例