2015-10-14 1 views
1

J'ai QGraphicsItems sur QGraphicsScene. J'ai besoin de les regrouper. La principale raison du regroupement: je dois fournir un moyen d'appliquer des transformations sur un groupe.QGraphicsItemGroup se déplace pendant les transformations

Tout est très simple si j'ai besoin d'appliquer une seule transformation, et le rectangle de délimitation des éléments en haut à gauche est à 0,0.

J'ai vu comment fonctionne le regroupement et le dégroupage, en préservant les transformations des objets par rapport à la scène, et c'est génial. Mais sur le groupement, peu importe les positions de mes objets, le groupe a des coordonnées (0,0).

Lorsque j'essaie des transformations, peu importe ce que j'ai essayé avec le point d'origine de la transformation, l'élément se déplace.

programme simple pour afficher:

#include <QApplication> 
#include <QGraphicsView> 
#include <QGraphicsRectItem> 
#include <QDebug> 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    QGraphicsScene s; 
    QGraphicsView view(&s); 
    s.setSceneRect(90, -10, 420, 140); 
    view.show(); 
    QGraphicsRectItem* sceneR = new QGraphicsRectItem(s.sceneRect()); 
    s.addItem(sceneR); 

    QTransform t;      // simple scaling transform 
    t.scale(2, 1);      // adding rotation scares me 

    QGraphicsRectItem* r0 = new QGraphicsRectItem(QRectF(0, 0, 150, 100));  // for compare, not scaled 
    r0->setBrush(QBrush(Qt::red)); 
    r0->setPos(100, 0); 
    s.addItem(r0); 

    QGraphicsRectItem* r1 = new QGraphicsRectItem(QRectF(0, 0, 150, 100));  // for compare, not scaled 
    r1->setBrush(QBrush(Qt::blue)); 
    r1->setPos(100, 10); 
    s.addItem(r1); 

    QGraphicsRectItem* r2 = new QGraphicsRectItem(QRectF(0, 0, 150, 100));  // will make a group of a single item 
    r2->setFlags(QGraphicsItem::ItemIsSelectable); 
    r2->setBrush(QBrush(Qt::green)); 
    r2->setPos(100, 20); 
    r2->setSelected(true); 
    s.addItem(r2); 

    QGraphicsItemGroup* g = s.createItemGroup(s.selectedItems()); 
// QPointF topLeft = g->mapToScene(g->boundingRect().topLeft()); 
// g->setTransformOriginPoint(topLeft); 

    r1->setTransform(t); 
    g->setTransform(t); 
    qDebug() << r1->pos() << r1->transform(); 
    qDebug() << g->pos() << g->transform(); 

    return app.exec(); 
} 

Si j'applique des transformations, les mouvements d'objets groupés. Je n'ai pas été capable de comprendre une logique ou comment compenser.

enter image description here
(rouge = référence, pas mis à l'échelle, le bleu, de référence, mise à l'échelle, le vert, regroupés et mis à l'échelle)

Dans l'image I ci-dessus attend le rectangle vert pour avoir les mêmes coordonnée x en tant que bleu (I décalé verticalement pour voir ce qui se passe)

Comment puis-je mettre mon échelle (et rotation) en place?

(Je considère l'alternative de simplement définir un parent commun, et effectuer tout le travail pour récupérer des transformations d'éléments, mais je ne sais pas comment les combiner correctement, en particulier l'échelle d'un groupe comment trouver la nouvelle position et la nouvelle échelle de éléments internes)

Répondre

1

J'ai trouvé une solution - même si je compte sur le groupe pour effectuer des transformations d'objets et calculer ses propres arêtes, je dois aussi le faire manuellement.

Étapes:
je trouve le plus haut à gauche le point (minX, minY) des rectangles de délimitation des éléments sélectionnés (mis en correspondance avec la scène),
déplacer ensuite tous les articles par -minX, -minY,
puis après le regroupement, le groupe de mouvement des minX, minY.

Cela définit un centre correct de transformations, de sorte que l'élément de groupe se comporte comme des éléments normaux. Il signale également un pos() dans son coin supérieur gauche, similaire à la valeur par défaut pos() des autres QGraphicsItems.

+0

Génial !! Merci beaucoup. – FlKo