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.
(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)
Génial !! Merci beaucoup. – FlKo