PDA

View Full Version : Line doesnt Rotate on its center



21altf
31st October 2011, 02:12
I'm tryin to make a QGraphicsLineItem rotate, but everytime i trigger rotate it moves to another location. I mean, it does rotate, but not in a especific point! I think it its rotation in its QGraphicsView central point. I dunno how to fix it.

Here is the code:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <Qt>
#include <QGS.h>
#include <QGraphicsScene>
#include <QGraphicsLineItem>
#include <QEvent>
#include <QDropEvent>
#include <QSignalMapper>
#include <QMouseEvent>
#include <QtDebug>
#include <QWidget>
#include <QList>
#include <math.h>
#include <QtCore/qmath.h>


MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
MainWindow::setCentralWidget(ui->view);
scene = new QGS(this);
scene->setSceneRect(MainWindow::geometry());
ui->view->setSceneRect(MainWindow::geometry());

QObject::connect(ui->action_Line,SIGNAL(triggered()),this,SLOT(criarLin ha()));
QObject::connect(ui->action_New,SIGNAL(triggered()),this,SLOT(newFile() ));
QObject::connect(ui->actionR_otate,SIGNAL(triggered()),this,SLOT(rotate ()));

ui->view->setScene(scene);
ui->view->setMouseTracking(true);
setWindowTitle(tr("AutoPac v1.0"));



}

//Private Functions
MainWindow::~MainWindow()
{
delete ui;
}


//Private Slots
void MainWindow::criarLinha()
{

scene->setMode(scene->InsertLine);
}

void MainWindow::newFile()
{
scene = new QGS(this);
scene->setSceneRect(QRectF(0, 0, 512, 600));
ui->view->setScene(scene);
}

void MainWindow::rotate()
{
int i = 0;
// qreal x1,y1,x2,y2;

// x1 = 0;
// y1 = 0;
// x2 = 0;
// y2 = 0;

// double pi = 3.1415;

for (i = 0 ; i < scene->selectedItems().length() ; i++)
{
if(scene->selectedItems().at(i)->type() == QGraphicsLineItem::Type)
{

scene->selectedItems().at(i)->rotate(90); //90 is just an example
scene->selectedItems().at(i)->setSelected(true);


}
}

}

Santosh Reddy
1st November 2011, 01:04
Check this out, use setTransformOriginPoint(), and setRotation()


//main.cpp
#include <QtGui>
// QGraphicsLineItem rotate
class MyWidget : public QMainWindow
{
Q_OBJECT
public:
MyWidget(QWidget* parent = 0)
: QMainWindow(parent)
, scene(new QGraphicsScene(this))
, view(new QGraphicsView(scene, this))
, action_New(menuBar()->addAction("New", this, SLOT(newLine())))
, action_Rotate(menuBar()->addAction("Rotate", this, SLOT(rotateLine())))
{
setCentralWidget(view);
startTimer(100);
}
private slots:
void newLine()
{
QGraphicsLineItem* item = scene->addLine(0, 0, 100, 100, QPen(QBrush(Qt::red), 4));
item->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable);
item->setTransformOriginPoint(item->boundingRect().center());
}


void rotateLine()
{
for(int i = 0 ;i < scene->selectedItems().count() ;i++)
if(scene->selectedItems().at(i)->isSelected())
if(scene->selectedItems().at(i)->type() == QGraphicsLineItem::Type)
scene->selectedItems().at(i)->setRotation(scene->selectedItems().at(i)->rotation() + 20);
}
protected:
void timerEvent(QTimerEvent* event)
{
rotateLine();
}


private:
QGraphicsScene* scene;
QGraphicsView* view;
QAction* action_New;
QAction* action_Rotate;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyWidget w;
w.show();
return a.exec();
}
#include "main.moc"