在QModelIndex中存储两种不同的类型

时间:2016-03-14 14:32:17

标签: c++ qt

我有一个由NodeEdge 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;以及"某种类型的东西")?

2 个答案:

答案 0 :(得分:1)

将图表创建为分离的数据结构。您的节点 edge 对象将具有唯一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";
}

答案 1 :(得分:0)

查看QVariant和(可能)qRegisterMetaType