2011-07-04 47 views
0

私はQGraphicsItemsを選択してグループとして回転させることができるアプリケーションを実装したいと思います。 QGraphicsItemGroupにすべてのアイテムを追加できますが、各アイテムのZ-valueを保管する必要があります。出来ますか?QGraphicsItemの選択と回転

私も第2の質問があります。 私は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))); 

は、私が第2の回転後のアイテムがポイント(0,0)の周りに他のいくつかのポイント(私はこれを知っていない)を中心に回転されていないことに気づきました。私は、私が操作の順序を変えれば、すべてがうまくいくことに気づいた。

私は間違っていますか?

答えて

0

最初の問題については、Q値を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(); 

EDIT: あなたはグローバル座標系原点の周りを回転することを意図する場合には、への回転を変更します。

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

のは、私を言わせて (item1 = 1、item2 = 2、item3 = 3、item4 = 4) [グループ(item1 = 1、 item3 = 3)] = 5 この操作nはitem1とitem3を私のシーンの上部に移動させます。私は、アイテムがグループ化されているかどうかにかかわらず、私のシーンの "スタックのレイヤー"を変更しないでください。 –

+0

私はあなたが実際にやりたいことを理解していません... は、画像を描くか、問題を正確に言い換えることができます。 私が掲示したコードは、 "もう一度、今は(0,0)の周りに"グローバル座標フレームの原点を意味しない限り、あなたが望む回転(2番目の質問)を行います。 この場合、ピボット回転に似た別の回転を行いますが、ピボットを(0,0)に変更してください。 私はまだあなたが "変化していない層のスタック"とは何を意味するのか分かりません。 ピボットを中心に複数のオブジェクトを回転させて、ローカル回転を保持したいのですか? – pokey909

関連する問題