我在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());
}
答案 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文件。
正如我在上面的评论中所提到的,我希望有一个更优雅的解决方案,因为我认为这不会适应两个场景的边界不同的情况。