虽然 items 函数返回 QGraphicsItem 指针列表,但您可以尝试使用 dynamic_casting 来检查它是否是 Node 指针,或者使用 Qt 元数据和 type() 函数。
但是,我经常使用的方法(也可以在其他方面为您提供帮助)是为每种类型的对象维护唯一的 ID 和项目 ID 的静态列表。例如: -
class BaseItem : public QGraphicsItem
{
public:
BaseItem(QGraphicsItem* parent)
: QGraphicsItem(parent), m_Id(m_NextId++) // initialising the object's unique Id
{
}
unsigned int ID() const
{
return m_Id;
}
private:
static unsigned int m_NextId; // the next Object Id, initialised to 0 in implementation
unsigned int m_Id; // the object's unique Id
}
class Node : public BaseItem
{
public:
Node(QGrahicsItem* parent)
: BaseItem(parent)
{
m_NodesList.push_back(m_Id);
}
private:
static QList<unsigned int> m_sNodesList; // all Node ids in the scene
QList<unsigned int> m_linkedNodeList; // linked nodes
}
添加到 GraphicsScene 的所有项目都继承自 BaseItem
您还有一个静态节点 ID 列表,因此您可以遍历所有这些以进行加载/保存,并且您可以在基类中添加一个静态帮助函数以返回节点列表,方法是搜索节点 ID 列表和将它们与场景中的节点指针相匹配。
这种架构还允许您在每个 Node 对象中包含链接节点 ID 的列表,而不是使用 Qt 的父/子系统,在节点图的情况下,这并不总是需要的。
总的来说,我已经在许多 QGraphicsScene 应用程序中使用了这种架构,并且它确实使开发与其他项目具有复杂链接的项目变得非常容易。