qt - QGraphicsView/QGraphicsScene: cómo arreglar la coordenada X o Y de un elemento durante la rotación?
rotation (1)
Tengo alrededor de 150 QGraphicsLineItems en un QGraphicsScene, y quiero "rotarlos", pero la rotación no afecta a su coordenada X. En otras palabras, se moverían verticalmente según un ángulo de rotación dado, pero en realidad no girarían ni se moverían horizontalmente.
La razón por la que me gustaría hacer esto es que hay muchos otros elementos en un QGraphicsScene / View adyacente que se rotan normalmente, y quiero que los elementos en esta nueva escena / vista coincidan con la altura mostrada de los artículos que giran normalmente.
Agradecería algunas sugerencias o comentarios. ¡Gracias!
EDITAR: Aquí tengo un diálogo en el que dibujo dos cuadrados en escena1, y dos líneas en escena2. Mientras arrastro el control deslizante, espero obtener el comportamiento especificado anteriormente, pero todo lo que sucede es que los cuadrados están girando (como deberían), mientras que las líneas no hacen nada (deben moverse hacia arriba y hacia abajo con los cuadrados). Tenga en cuenta que no hay ningún error de compilación.
Aquí está el constructor de diálogo:
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
// These points will initially translate the squares and respective lines.
QPointF p1(-20,-5);
QPointF p2(30,30);
QGraphicsScene *scene1 = new QGraphicsScene;
QGraphicsRectItem *square1 = new QGraphicsRectItem(-10,-10,20,20);
QGraphicsRectItem *square2 = new QGraphicsRectItem(-10,-10,20,20);
square1->translate(p1.x(),p1.y());
square2->translate(p2.x(),p2.y());
scene1->addItem(square1);
scene1->addItem(square2);
QGraphicsScene *scene2 = new QGraphicsScene;
line1 = new QGraphicsLineItem(0,0,20,0);
line2 = new QGraphicsLineItem(0,0,20,0);
line1->translate(0,p1.y());
line2->translate(0,p2.y());
scene2->addItem(line1);
scene2->addItem(line2);
ui->graphicsView->setScene(scene1);
ui->graphicsView2->setScene(scene2);
}
Y la ranura del control deslizante de rotación:
void Dialog::on_verticalSlider_valueChanged(int value)
{
ui->graphicsView->resetTransform();
ui->graphicsView->rotate(value);
p1 = ui->graphicsView->transform().map(p1);
p2 = ui->graphicsView->transform().map(p2);
line1->translate(0,p1.y());
line2->translate(0,p2.y());
}
Esto es lo que se me ocurrió que está funcionando:
Dialog.cpp:
#include "dialog.h"
#include "ui_dialog.h"
#include <QtGui>
Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog)
{
ui->setupUi(this);
p1.setX(-20); p1.setY(-5);
p2.setX(30); p2.setY(30);
QGraphicsScene *scene1 = new QGraphicsScene;
QGraphicsRectItem *square1 = new QGraphicsRectItem(-10,-10,20,20);
QGraphicsRectItem *square2 = new QGraphicsRectItem(-10,-10,20,20);
square1->translate(p1.x(),p1.y());
square2->translate(p2.x(),p2.y());
scene1->addItem(square1);
scene1->addItem(square2);
QGraphicsScene *scene2 = new QGraphicsScene;
line1 = new QGraphicsLineItem(-20,0,20,0);
line2 = new QGraphicsLineItem(-20,0,20,0);
line1->translate(0,p1.y());
line2->translate(0,p2.y());
scene2->addItem(line1);
scene2->addItem(line2);
ui->graphicsView1->setScene(scene1);
ui->graphicsView2->setScene(scene2);
currentp1tr = p1.y();
currentp2tr = p2.y();
}
void Dialog::on_verticalSlider_valueChanged(int value)
{
ui->graphicsView1->resetTransform();
ui->graphicsView1->rotate(value);
QPointF temp1 = ui->graphicsView1->transform().map(p1);
QPointF temp2 = ui->graphicsView1->transform().map(p2);
line1->translate(0,temp1.y() - currentp1tr);
line2->translate(0,temp2.y() - currentp2tr);
currentp1tr = temp1.y();
currentp2tr = temp2.y();
}
Dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QtGui>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
private slots:
void on_verticalSlider_valueChanged(int value);
private:
Ui::Dialog *ui;
QGraphicsLineItem *line1;
QGraphicsLineItem *line2;
QGraphicsScene *scene1;
QGraphicsScene *scene2;
QPointF p1;
QPointF p2;
float currentp1tr;
float currentp2tr;
};
También necesita un archivo UI con GraphicsView1, GraphicsView2 y verticalSlider.
Como mencioné en un comentario anterior, esperaba una solución más elegante, ya que creo que esto no acomodará las situaciones en las que las rectas de las dos escenas son diferentes.