【问题标题】:QGraphicsItem's - selection & rotationQGraphicsItem's - 选择和旋转
【发布时间】:2011-09-28 03:53:10
【问题描述】:

我想实现允许用户选择几个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) 旋转,而是围绕其他点(我不知道是哪个点)旋转。我还注意到,如果我改变操作顺序,一切都会很好。

我做错了什么?

【问题讨论】:

    标签: qt rotation qgraphicsitem


    【解决方案1】:

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

    我猜这个 sn-p 会解决你的第二个问题:

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

    【讨论】:

    • 假设我的场景中有几个项目(名称=Z 值):(item1=1,item2=2,item3=3,item4=4)现在我想将其中两个分组: [Group(item1=1,item3=3)]=5 这个操作会让 item1 和 item3 到我场景的顶部。无论项目是否分组,我都希望场景的“图层堆栈”保持不变。
    • 我不明白你真正想要做什么......要么画一张照片,要么准确地重新表述你的问题。我发布的代码会执行您想要的旋转(您的第二个问题),除非“再一次但现在在 (0,0) 附近”您的意思是关于全局坐标系的原点。在这种情况下,只需进行另一个类似于枢轴旋转的旋转,但将枢轴更改为 (0,0)。我仍然不知道您所说的“层堆栈不变......”是什么意思。你想围绕一个轴旋转多个对象并保留它们的局部旋转吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多