Выводится виджет с MyGraphicsScene, по нажатии кнопки на сцену добавляется фигура координата верхнего правого угла которой 200, 200, далее, если зажать фигуру мышкой и перемещать ее, в консоль выводится координаты верхнего правого угла ограничивающего прямоугольника и позиция элемента в координатах сцены.
ВОПРОС: почему при перемещении фигуры координаты верхнего правого угла ограничивающего прямоугольника не изменяются вообще, а вместо координат сцены выводятся локальные координаты объекта при том что используется QGraphicsItem::scenePos()
хедер
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QGraphicsScene>
#include <QDebug>
#include <QGraphicsView>
#include <QFile>
#include <QFileDialog>
#include <QMessageBox>
#include <QGraphicsItem>
#include <QPainter>
#include <QMouseEvent>
#include <QGraphicsSceneMouseEvent>
#include <QTextCursor>
#include <QLineEdit>
#include <QTransform>
#include <QTextCodec>
#include <QMenu>
#include <QApplication>
#include <QTextDocument>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
};
class MyGraphicsScene : public QGraphicsScene
{
Q_OBJECT
public:
MyGraphicsScene(qreal x, qreal y, qreal width, qreal height, QObject *parent = 0 );
private:
QList<QGraphicsItem *> selected_items;
void mousePressEvent ( QGraphicsSceneMouseEvent * event );
void mouseMoveEvent ( QGraphicsSceneMouseEvent * event );
// void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
// void contextMenuEvent ( QGraphicsSceneContextMenuEvent * contextMenuEvent );
// void keyPressEvent ( QKeyEvent * keyEvent );
QGraphicsItem *tempItem; // указатель используется указания на элемент над которым был произведен щелчок мышью
// QMenu * contextMenu;
};
#endif // MAINWINDOW_H
CPP файл
#include "Pmainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->graphicsView->setScene(new MyGraphicsScene(0,0,ui->graphicsView->width(),
ui->graphicsView->height(), ui->graphicsView));
}
MainWindow::~MainWindow()
{
delete ui;
}
MyGraphicsScene ::MyGraphicsScene(qreal x, qreal y, qreal width, qreal height, QObject *parent ):
QGraphicsScene(x, y, width, height, parent )
{
tempItem = 0;
// contextMenu = new QMenu;
// QAction *deleteAction = contextMenu->addAction(tr("&delete Item"));
// connect(deleteAction, SIGNAL(triggered()), this, SLOT(remove_item()));
};
void MyGraphicsScene :: mousePressEvent ( QGraphicsSceneMouseEvent * event )
{
tempItem = this->itemAt(event->scenePos());
}
void MyGraphicsScene :: mouseMoveEvent ( QGraphicsSceneMouseEvent * event )
{
if (tempItem) // иначе если есть один элемент зажатый указателем мыши, перемещаем его
{
tempItem->setPos(event->scenePos() - event->lastScenePos() + tempItem->pos() );
/* tempItem->resetMatrix(); // boundrect
tempItem->resetTransform();// фигуры
tempItem->update(); // НЕ
views()[0]->resetTransform(); // ОБНОВЛЯЕТСЯ
views()[0]->resetMatrix(); //
*/
qDebug() << tempItem->boundingRect().left()
<< tempItem->boundingRect().top()
<< tempItem->scenePos().x()// почему scenePos()возвращает в собств
<< tempItem->scenePos().y();// коорд элемента, а не коорд сцены
}
}
void MainWindow::on_pushButton_clicked()
{
QGraphicsItem* v = ui->graphicsView->scene()->addRect(200,200, 60, 70);
v->setFlag(QGraphicsItem::ItemIsSelectable);
v->setFlag(QGraphicsItem::ItemIsMovable);
}