开发者

QGraphicsItem's - selection & rotation

I'd like to implement application which allows user to select few QGraphicsItems and then rotate them as a gro开发者_开发百科up. I know that I could add all items into one QGraphicsItemGroup but I need to keep Z-value of each item. Is it possible?

I also have a second question. I'm trying to rotate QGraphicsItem around some point (different from (0,0) - let's say (200,150)). After that operation I want to rotate this item once more time but now around (0,0). I'm using code below:

    QPointF point(200,150); // point is (200,150) at first time and then it is changed to (0,0) - no matter how...
    qreal x = temp.rx();
    qreal y = temp.ry();
    item->setTransform(item->transform()*(QTransform().translate(x,y).rotate(angle).translate(-x,-y)));

I noticed that after second rotation the item is not rotated around point (0,0) but around some other point (I don't know which). I also noticed that if I change order of operations it all works great.

What am I doing wrong?


Regarding your first problem, why should the z-values be a problem when putting them into a QGraphicsGroup? On the other hand you could also iterate through the selected items and just apply the transformation.

I guess this snippet will solve your 2nd problem:

QGraphicsView view;
QGraphicsScene scene;

QPointF itemPosToRotate(-35,-35);
QPointF pivotPoint(25,25);

QGraphicsEllipseItem *pivotCircle = scene.addEllipse(-2.5,-2.5,5,5);              
pivotCircle->setPos(pivotPoint);

QGraphicsRectItem *rect = scene.addRect(-5,-5,10,10);
rect->setPos(itemPosToRotate);

// draw some coordinate frame lines
scene.addLine(-100,0,100,0);
scene.addLine(0,100,0,-100);

// do half-cicle rotation
for(int j=0;j<=5;j++)
for(int i=1;i<=20;i++) {
    rect = scene.addRect(-5,-5,10,10);
    rect->setPos(itemPosToRotate);

    QPointF itemCenter = rect->pos();
    QPointF pivot = pivotCircle->pos() - itemCenter;


    // your local rotation
    rect->setRotation(45);

    // your rotation around the pivot
    rect->setTransform(QTransform().translate(pivot.x(), pivot.y()).rotate(180.0 * (qreal)i/20.0).translate(-pivot.x(),-pivot.y()),true);
}
view.setScene(&scene);
view.setTransform(view.transform().scale(2,2));
view.show();

EDIT: In case you meant to rotate around the global coordinate frame origin change the rotations to:

rect->setTransform(QTransform().translate(-itemCenter.x(), -itemCenter.y()).rotate(360.0 * (qreal)j/5.0).translate(itemCenter.x(),itemCenter.y()) );
rect->setTransform(QTransform().translate(pivot.x(), pivot.y()).rotate(180.0 * (qreal)i/20.0).translate(-pivot.x(),-pivot.y()),true);
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜