QGraphicsItem's - выбор и вращение - PullRequest
0 голосов
/ 04 июля 2011

Я хотел бы реализовать приложение, которое позволяет пользователю выбирать несколько 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 голосов
/ 04 июля 2011

Относительно вашей первой проблемы, почему значения 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();

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