QGraphicsItem的 - 选择&回转

时间:2011-07-04 13:18:09

标签: qt rotation qgraphicsitem

我想实现允许用户选择少量QGraphicsItems然后将其作为一组旋转的应用程序。我知道我可以将所有项目添加到一个QGraphicsItemGroup中,但我需要保留每个项目的Z-value。有可能吗?

我还有第二个问题。 我正在尝试围绕某个点旋转QGraphicsItem(与(0,0)不同 - 让我们说(200,150))。在那次操作之后,我想再次旋转这个项目,但现在围绕(0,0)。我正在使用以下代码:

    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)));

我注意到在第二次旋转后,物品不会围绕点(0,0)旋转,而是围绕其他点旋转(我不知道哪个点)。我还注意到,如果我改变操作顺序,那一切都很有效。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

关于你的第一个问题,为什么将z值放入QGraphicsGroup时会出现问题? 另一方面,您也可以遍历所选项目并仅应用转换。

我想这段代码会解决你的第二个问题:

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();

编辑: 如果您打算围绕全局坐标系原点旋转,请将旋转更改为:

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);