Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Qt remove object with contains() when the position is set

Tags:

c++

qt

I have a scene and inside the scene I have the ellipses (circles) to which I change the position with setPos() so when I ask for its position later I will not get 0,0 coordinates, but now when I want to delete the object, the member function contains() does not ever evaluate to true understandably. The question is, how can I get to the scene coordinates or object coordinates so when I click on the object I get the true evaluation of contains() member function. I have tried the mapToScene(), mapFromScene() which do not help. (still kinda lost in Qt coordinate system)

Code sample:

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
    }
}
like image 613
Croolman Avatar asked Dec 16 '25 12:12

Croolman


1 Answers

The QGraphicsItem::contains method takes points in local coordinates, that is in coordinates with (0, 0) being the center of the QGraphicsItem.

You are using points in global scene coordinates. To get a point in local coordinates of a given QGprahicsItem you can use the QGraphicsItem::mapFromScene(const QPointF & point) method.

You might want to do something like :

for(Object& obj : objects)
    if(obj.contains(obj.mapFromScene(point)))
        // do stuf because point is inside obj

Sources :

  • http://doc.qt.io/qt-4.8/graphicsview.html#item-coordinates
  • http://doc.qt.io/qt-4.8/qgraphicsitem.html#contains
like image 113
Maxime Alvarez Avatar answered Dec 19 '25 03:12

Maxime Alvarez



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!