PDA

View Full Version : How to add items in a QGraphicsScene?



schmimona
3rd August 2011, 08:33
Hi,

I am trying to add some custom QGraphicsItems in a QGraphicsScene on mouse click and at mouse cursor coordinates. But the items are not added at the same coordinates as the mouse cursor's.



renderArea::renderArea(QWidget *parent):
QGraphicsView(parent)
{
scene = new QGraphicsScene(this);
scene->setItemIndexMethod(QGraphicsScene::NoIndex);
scene->setSceneRect(0, 0, 850, 480);
setScene(scene);
setCacheMode(CacheBackground);
setViewportUpdateMode(BoundingRectViewportUpdate);
setRenderHint(QPainter::Antialiasing);
setTransformationAnchor(AnchorUnderMouse);
scale(qreal(1.0), qreal(1.0));
setMinimumSize(400, 400);
}

void renderArea::mousePressEvent(QMouseEvent *event)
{
QPoint p = event->pos();

updateList(p);
}

void renderArea::updateList(const QPoint &p)
{
Point point;
point.point = p;
point.isSelected = false;
list.append(point);
if (list.size() > 1)
updateClothoid(list[list.size()-2].point, list[list.size()-1].point);
}

void renderArea::updateClothoid(const QPoint &p1, const QPoint &p2)
{
Clothoid *temp = new Clothoid(p1, p2);

clothoids.append(temp);

scene->addItem(temp);
}


renderArea being the QGraphicsView and Clothoids the custom QGraphicsItem



Clothoid::Clothoid(QPoint startPoint, QPoint endPoint)
{
sPoint = startPoint;
ePoint = endPoint;
startCurvature = 0.0;
endCurvature = 0.0;
clothoidLength = sqrt(pow(endPoint.x() - startPoint.x(),2) +
pow(endPoint.y() - startPoint.y(),2));
}

QRectF Clothoid::boundingRect() const
{
qreal penWidth = 1;

if ((sPoint.x() &lt ePoint.x()) && (sPoint.y() &lt ePoint.y()))
return QRectF(sPoint.x(), sPoint.y(), ePoint.x() - sPoint.x(), ePoint.y()-sPoint.y())
.normalized()
.adjusted(-penWidth, -penWidth, penWidth, penWidth);

if ((sPoint.x() &lt ePoint.x()) && (sPoint.y() > ePoint.y()))
return QRectF(sPoint.x(), ePoint.y(), ePoint.x() - sPoint.x(), sPoint.y() - ePoint.y())
.normalized()
.adjusted(-penWidth, -penWidth, penWidth, penWidth);

if ((sPoint.x() > ePoint.x()) && (sPoint.y() &lt ePoint.y()))
return QRectF(ePoint.x(), sPoint.y(), sPoint.x() - ePoint.x(), ePoint.y()-sPoint.y())
.normalized()
.adjusted(-penWidth, -penWidth, penWidth, penWidth);

if ((sPoint.x() > ePoint.x()) && (sPoint.y() > ePoint.y()))
return QRectF(ePoint.x(), ePoint.y(), sPoint.x() - ePoint.x(), sPoint.y() - ePoint.y())
.normalized()
.adjusted(-penWidth, -penWidth, penWidth, penWidth);

return QRectF();

}

void Clothoid::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{
QLineF line(sPoint, ePoint);

// Draw the line itself
painter->setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
painter->drawLine(line);
}


I am guessing that the coordinates to which I am inserting the items belong to the GraphicsView and not the scene as in my application the scene doesn't cover the entire view. But how could I get the coordinates of the scene in my case?

vallidor
3rd August 2011, 08:39
hmm, i may not be seeing the code which actuates the rendering to your scene in its entirety, but i would expect to see a 'QPointF QGraphicsView::mapToScene ( const QPoint & point ) const' in use to translate the click coordinates from the View to Scene coordinates, probably in updateList(). is this what you meant?

schmimona
3rd August 2011, 08:53
yes..that was exactly what I meant. Thanks. It works now. :D