QGraphicsView / QGraphicsScene:如何在旋转期间修复项目的X或Y坐标?

时间:2012-02-04 00:12:07

标签: qt rotation qgraphicsview

我在QGraphicsScene中有大约150个QGraphicsLineItems,我想“旋转”它们,但旋转不会影响它们的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 个答案:

答案 0 :(得分:1)

以下是我提出的工作原理:

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的UI文件。

正如我在上面的评论中所提到的,我希望有一个更优雅的解决方案,因为我认为这不会适应两个场景的边界不同的情况。