如何在 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>
一张。
我想 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>
一张。