我有一个场景,在场景中我有椭圆(圆圈),我用setPos()
改变位置,所以当我稍后询问它的位置时,我不会得到0,0坐标,但现在当我想删除该对象,成员函数contains()
永远不会评估为真正可以理解。问题是,我怎样才能到达场景坐标或对象坐标,所以当我点击对象时,我得到contains()
成员函数的真实评价。我尝试了mapToScene()
,mapFromScene()
没有帮助。 (仍然在Qt坐标系中丢失了)
代码示例:
void MyQGraphicsView::mousePressEvent(QMouseEvent * e)
{
QPointF pt = mapToScene(e->pos());
if(e->button()==Qt::RightButton)
{
// remove point
QList<QGraphicsItem *> listIt = scene->items();
QList<QGraphicsItem *>::const_iterator stlIter;
QGraphicsItem * itemToRemove = NULL;
QGraphicsEllipseItem it; // for type checking
for(stlIter = listIt.begin(); stlIter != listIt.end(); ++stlIter)
{
// if it has the expected type and the point is inside (type checking is redundant)
if(((*stlIter)->type() == it.type()) && ((*stlIter)->contains(pt))){
// contains(pt) is never true - understandably
itemToRemove = *stlIter;
break;
}
}
if(itemToRemove != NULL) scene->removeItem(itemToRemove);
}else{ // leftClick to add ellipse
double rad = 10;
QGraphicsEllipseItem* pEllipse = scene->addEllipse(-rad, -rad, rad*2.0, rad*2.0, QPen(Qt::red,0), QBrush(Qt::red,Qt::SolidPattern));
pEllipse->setPos(pt.x(), pt.y()); // set the postion so it does not return 0,0
}
}
答案 0 :(得分:2)
QGraphicsItem::contains
方法采用本地坐标中的点,即坐标(0, 0)
为QGraphicsItem
的中心。
您正在全局场景坐标中使用点。
要获得给定QGprahicsItem
的本地坐标中的点,您可以使用QGraphicsItem::mapFromScene(const QPointF & point)
方法。
您可能想要执行以下操作:
for(Object& obj : objects)
if(obj.contains(obj.mapFromScene(point)))
// do stuf because point is inside obj
来源: