2016-03-14 25 views
0

我具有由Node S和Edge小号表示的图形和我写一个适配器,所以我可以以表格形式使用Qt的标准视图,像这样查看图表:存储两种不同类型的在QModelIndex

Node1 
    -Edge1 
     -Node2 
    -Edge2 
     -Node3 
    -Edge3 
     -Node1 
Node2 
Node3 
    -Edge4 
     -Node1 

我这样做是利用重载为QAbstractItemModel::createIndex存储或者一个索引位置(quintptr过载)或指向正确的项目(void*过载)。然而,这是愚蠢的,因为它实际上并不重要,因为它总是只有一个值,只为QModelIndex::internalPointer()QModelIndex::internalID()转换。不用说,它会在某些情况下造成冲突,导致模型崩溃,这就是我发现这是一个坏主意的原因。

现在我不能找出作为第三变量存储在QModelIndex,这样我可以区分:

1)索引点下一些节点

2)索引指向一个到边缘下一些边缘

空值节点当前正被“用过的”识别顶层节点。在这两种情况下我应该存储什么来可靠地识别父母?有没有办法在QModelIndex中存储两种不同的“事物”(除了“无”和“某种类型的东西”)?

回答

1

创建您的图表作为一个分离的数据结构。你节点边缘对象将有一个唯一的ID。并且在QModelIndex内使用此ID。

编辑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"; 
} 
+0

我不知道我怎么可以创建一个唯一的ID,使其从ID本身,它指向的是一个节点或边缘加在哪里可以找到它的信息明显。我确实有ID,但是它们是指向找到该项目的相应位置的索引,但不知道该对象是什么(节点或边缘)。到目前为止,我唯一的想法是创建基类,它可以告诉我这种差异(使用bool成员)和基于此的static_cast。 – Resurrection