crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Не возвращаются координаты сцены
hemmul
  опции профиля:
сообщение 27.4.2012, 10:15
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 9.3.2012
Пользователь №: 3254

Спасибо сказали: 0 раз(а)




Репутация:   0  


Выводится виджет с 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);
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 27.4.2012, 15:01
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Цитата(hemmul @ 27.4.2012, 11:15) *
ВОПРОС: почему при перемещении фигуры координаты верхнего правого угла ограничивающего прямоугольника не изменяются вообще

координаты ограничивающего прямоугольника рассчитываются в локальной системе координат элемента, а не родителя (в вашем случае сцены). с чего вы решили что что то должно поменяться?
Цитата(hemmul @ 27.4.2012, 11:15) *
а вместо координат сцены выводятся локальные координаты объекта при том что используется QGraphicsItem::scenePos()


Что значит локальные координаты объекта (0, 0)?

в вашем коде в консоль выведется координата левого верхнего в его локальной системе координат и принтанется координата позиции элемента на сцене, не понятна суть проблемы на самом деле.


Для того чтоб узнать как поменлся ограничивающий прямоугольник на сцене надо применить:
QRectF sceneItemBoundRect = tempItem->mapRectToScene(tempItem->boundingRect());
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
hemmul
  опции профиля:
сообщение 28.4.2012, 9:07
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 9.3.2012
Пользователь №: 3254

Спасибо сказали: 0 раз(а)




Репутация:   0  


Благодарю за консультацию.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 4.12.2024, 19:18