Qt在设置位置时删除包含contains()的对象

时间:2017-05-01 09:59:06

标签: c++ qt

我有一个场景,在场景中我有椭圆(圆圈),我用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
    }
}

1 个答案:

答案 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

来源: