QGraphicsView / QGraphicsScene: Как исправить координаты X или Y элемента во время вращения? - PullRequest
1 голос
/ 04 февраля 2012

У меня есть около 150 QGraphicsLineItems в QGraphicsScene, и я хочу их «вращать», но поворот не влияет на их координату X.Другими словами, они будут двигаться вертикально в соответствии с заданным углом поворота, но на самом деле они не будут вращаться или двигаться горизонтально.

Причина, по которой я хотел бы сделать это, состоит в том, что всмежный QGraphicsScene / View, который вращается нормально, и я хочу, чтобы элементы в этой новой сцене / представлении соответствовали отображаемой высоте нормально вращающихся элементов.

Буду признателен за некоторые предложения или отзывы.Спасибо!

РЕДАКТИРОВАТЬ: Здесь у меня есть диалог, в котором я рисую два квадрата на scene1 и две линии на scene2.Когда я перетаскиваю ползунок, я надеюсь получить указанное выше поведение, но все, что происходит, это то, что квадраты вращаются (как они должны), в то время как линии ничего не делают (они должны двигаться вверх и вниз с квадратами).Обратите внимание, что ошибок компиляции нет.

Вот конструктор диалога:

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

И слот ползунка вращения:

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());
}

1 Ответ

1 голос
/ 05 февраля 2012

Вот то, что я придумал, работает:

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;
};

Вам также нужен файл пользовательского интерфейсас GraphicsView1, GraphicsView2 и verticalSlider.

Как я уже упоминал в вышеприведенном комментарии, я надеялся на более элегантное решение, так как думаю, что оно не будет соответствовать ситуациям, в которых ограничивающие рамки двух сценотличается.

...