QGraphicsScene: Wrong coordinates returned for position?
-
I am intrigued by the following behavior when returning the position of a QGraphicsObject
Here is the code for three cases I tested:
@QGraphicsScene scene;
scene.setSceneRect(-(QApplication::desktop()->width()-10)/2, -(QApplication::desktop()->height()-10)/2, QApplication::desktop()->width()-10, QApplication::desktop()->height()-10);// 1. This will draw a thick line starting from the center of the screen (at scene position 0,0)
Wall *topWall = new Wall(QRectF(0, 0, scene.sceneRect().width(), WallThickness));
qreal xx = topWall->x(); // The value of x is 0
scene.addItem(topWall);// 2. This will draw a thick line at the top of the screen (at pos -315, -175)
Wall *topWall = new Wall(QRectF(0, 0, scene.sceneRect().width(), WallThickness));
topWall->setPos(scene.sceneRect().x(), scene.sceneRect().y());
qreal xx = topWall->x(); // The value of x is -315
scene.addItem(topWall);// 3. This will draw a thick line at the top of the screen (at pos -315, -175)
Wall *topWall = new Wall(QRectF(scene.sceneRect().x(), scene.sceneRect().y(), scene.sceneRect().width(), WallThickness));
qreal xx = topWall->x(); // The value of x is 0 !!! Why?
scene.addItem(topWall);@Why is the value of x zero in the 3rd example? I guess the answer would be: because the position is not set. Then why is the line drawn at the right position?
Just a note:
scene.sceneRect().x() returns -315
scene.sceneRect().y() returns -175And the implementation of Wall:
@Wall::Wall(QRectF aRectF, QGraphicsItem *parent)
: QGraphicsObject(parent)
, rect(aRectF)
{
}Wall::~Wall()
{
}QRectF Wall::boundingRect() const
{
qreal adjust = 0.5;
return QRectF(rect.x() - adjust, rect.y() - adjust, rect.width() + adjust, rect.height() + adjust);
}QPainterPath Wall::shape() const
{
QPainterPath path;
path.addRect(boundingRect());
return path;
}void Wall::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
QPen pen(niceBlue);
painter->setPen(pen);
painter->setBrush(niceBlue);
painter->drawRect(rect);
}@
Thanks!
-
I'm not an expert in this area. You posted in Mobile/Embedded but perhaps it isn't related to mobile?
It is because the coords are mapped to the wall. When you initialise the Wall with a QRectF, the x and y set the 'top-left' corner of the wall. In the mapping process, this is mapped as the 'origin' (0,0).
However, if you set top-left to (0,0) as you do in #2, it will be mapped as (0,0) at the top-left corner. So when you change the position to -315,-175, that will be the position of x,y.
It will still draw at the correct location, only the mapping is changed.
Read here for further details: http://doc.qt.nokia.com/latest/qrectf.html#QRectF-4
There is quite a lot of functions in QRectF to move either the mapping (won't affect x) or without mapping (does affect x).
Hope you understood that :) Tell me if you need clarification.
-
[quote author="dflorin" date="1292623469"]Why is the value of x zero in the 3rd example? I guess the answer would be: because the position is not set.[/quote]
That is correct.
[quote author="dflorin" date="1292623469"] Then why is the line drawn at the right position?[/quote]
For the third Wall, you have set the rect to -315, -175. Coordinates for painting of the item are relative to the item's position (0, 0), and therefore match the scene coordinates.
-
Got it. Thanks!
I posted it in Mobile and Embedded as I am developing for Symbian. Actually I could not find a generic, platform independent forum, as this message is not specific to Desktop / Mobile and Embedded. Maybe there should be a Development forum which is not platform oriented.
Thanks again.