如何在 QGraphicsItem 中插入指针,以便当他们获得选定的指针时将被访问?

How to insert pointer in QGraphicsItem so when they get selected pointer will be accessed?

我想 select rectangle/polyline 通过鼠标单击场景,并且应该能够打印它的名称和其他 属性。它的名称和其他属性都在图形节点中。但是我不想再交互图了。

所以当我通过图形坐标绘制 rectangle/polyline 时,我应该能够在 rectangle/polyline 上存储一些图形节点的指针,所以当我点击 rectangle/polyline 时,然后通过该指针我可以访问它的名称和其他属性。

问题是`这可能吗?

在以上所有参数中,我只想存储_Ptr(它基本上是一个指针,但存储为long,使用时将进行类型转换)

 rect = new myRect();
    while(true)
    {    
       
       for(auto iter = verts.begin();iter != verts.end();++iter)
      {
        // getting co-ordinates of rectangle     
          QGraphicsRectItem* rectItem = rect->createRect(co-ordinates of rectangle);
          rect->_Ptr =  iter->_Ptr;  // trying to store _crossRefPtr  
      }

    }    

myRect.h

class myRect : public QGraphicsRectItem
{
   ........
  QGraphicsRectItem* createRect(QRectF& rect);       
  
}        
  

当我通过鼠标点击场景中的矩形时,我是这样做的:

if(_scene->selectedItems().count() != 0)
    {
        foreach(QGraphicsItem* currentItem, _scene->selectedItems())
        {
            QGraphicsRectItem* rItem = qgraphicsitem_cast<QGraphicsRectItem*>(currentItem);
            if(rItem)
            {
                myRect* r = reinterpret_cast<myRect*>(rItem);
                if(r)
                {
                    Instance (rectangle)
                    Instance* i = reinterpret_cast<Instance*>(r->_boostRefPtr); 
                    qDebug()<< i->Name();
                }
            }     
    

但是上面的方法是错误的。出现 运行 时间错误(显示详细堆栈跟踪)
所以问题是:

How to store pointer on QGraphicsItem so that, once they get selected, that pointer will be accessed ?

使用Qt的动态属性,勾选QObject::setProperty。它应该可以解决问题。

但是 AFAIC,我会使用双 QMap 直接关联 <graph_node, QGraphicsItem> AND <QGraphicsItem, graph_node> - 这样您就可以快速搜索两个关联,并且都是 O(log2(n)) 复杂度。您可以将其存储为图表的静态部分(更好)或独立(不是最好的主意)。显然,如果你的图表已经在 O(log2(n)) 中,你不需要这张地图,你只需要 <QGraphicsItem, graph_node> 一张。