我有一个由Node
和Edge
s代表的图表,我编写了一个适配器,因此我可以使用Qt标准视图以表格形式查看图形,如下所示:
Node1
-Edge1
-Node2
-Edge2
-Node3
-Edge3
-Node1
Node2
Node3
-Edge4
-Node1
我使用QAbstractItemModel::createIndex
的重载来存储索引位置(quintptr
重载)或指向正确项(void*
重载的指针)。然而,这是愚蠢的,因为它实际上并不重要,因为只有一个值只是为QModelIndex::internalPointer()
和QModelIndex::internalID()
转换而来。毋庸置疑,它会在某些情况下产生冲突,导致模型崩溃,这就是我发现这是一个坏主意。
现在我无法弄清楚要存储在QModelIndex
中作为第三个变量的内容,以便我可以区分:
1)索引指向某个节点下的边缘
2)索引指向某个边缘下的节点
目前正在使用空值"识别顶级节点。我应该在这两种情况下存储什么来可靠地识别父母?有没有办法存储两种不同的东西" ({&#34}除了"没有#34;以及"某种类型的东西")?
答案 0 :(得分:1)
将图表创建为分离的数据结构。您的节点和 edge 对象将具有唯一ID 。而不是在QModelIndex
。
编辑1:如何区分节点与边缘。
class CGraphElement
{
public:
enum Type
{
Node,
Edge
}
CGraphElement(Type type) : m_type(type) {}
bool isNode() const { return m_type == Node; }
bool isEdge() const { return m_type == Edge; }
private:
Type m_type;
};
// container mapping ID to graph Element (Node or Edge)
std::map<int, CGraphElement> mapId2Element;
void functionDealingWithModelIndex(const QModelIndex & index)
{
int id = index.internalID();
CGraphElement* element = mapId2Element[id];
if (element->isEdge())
qDebug() << "Edge";
else if (element->isNode())
qDebug() << "Node";
}
答案 1 :(得分:0)
查看QVariant和(可能)qRegisterMetaType。