Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: danquimby от Ноябрь 06, 2011, 16:19



Название: paint система координат
Отправлено: danquimby от Ноябрь 06, 2011, 16:19
Добрый вечер. У меня есть сцена (0,0,1000,800)
и есть обьекты у наследованные от QGraphicsPixmapItem
и переопределенный
Код:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);

создаю
Код:
MyObj* obj = new MyObj();
obj->setPos(300,300);
scene->addItem(obj);

Но координаты явно не те что я задал.Как преобразовать координаты
что бы 300 300 это были координаты сцены.


Название: Re: paint система координат
Отправлено: danquimby от Ноябрь 06, 2011, 16:57
Код:
void TableSubStrate::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/)
{

qDebug("--- %f %f",pos().x(),pos().y());
QPointF _pt = mapFromScene(pos());
qDebug("#--- %f %f",_pt.x(),_pt.y());
}

--- 370.000000 110.000000
#--- 0.000000 0.000000
--- 47.000000 320.000000
#--- 0.000000 0.000000
--- 105.000000 178.000000
#--- 0.000000 0.000000
--- 224.000000 119.000000
#--- 0.000000 0.000000


ничего не понимаю


Название: Re: paint система координат
Отправлено: danquimby от Ноябрь 06, 2011, 18:13
странно поделил на 2 О_о , но думаю это не верный подход.

Код:
void	ChipsImage::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/)
{

QPointF _pt = pos();
_pt.setX(_pt.x() / 2);
_pt.setY(_pt.y() / 2);
}

перелазил форум что то врузумительное не нашел


Название: Re: paint система координат
Отправлено: iroln от Ноябрь 06, 2011, 18:49
А метод scenePos() возвращает то же самое значение, что и pos()? Просто значение, которое возвращает pos() находится в системе координат предка элемента. Если у ваших элементов нет предков, то должно возвращаться значение позиции элемента в координатах сцены.

Только что проверил:
1. создал сцену (0, 0, 100, 100)
2. добавил на сцену pixmap c помощью метода сцены addPixmap()
3. смотрю что возвращает метод pos() элемента

Метод pos() возвращает координаты верхнего левого угла картинки в координатах сцены. Всё верно.


Название: Re: paint система координат
Отправлено: iroln от Ноябрь 06, 2011, 19:03
И зачем надо делать mapFromScene()?
Этот метод переводит точку из координат сцены в координаты элемента.

Для примера (считаем, что никаких трансформаций нет):
Есть элемент - картинка. Её позиция на сцене (10, 10)
Вызов item.mapFromScene(item.pos()) вернёт (0,0), потому что тут вы получаете точку в координатах элемента, в данном случае соответствующую верхнему левому углу элемента.

А вот если вызвать item.mapFromScene(20, 20), то это вернёт значение (10,10).

То есть начало координат в данном случае начинается от верхнего левого угла элемента.


Название: Re: paint система координат
Отправлено: danquimby от Ноябрь 07, 2011, 12:16
попробовал, результат (0,0)
но одно понял что Xpos \ 2 верный подход
проверял на 4х машинах разные windows результат
верный


Название: Re: paint система координат
Отправлено: iroln от Ноябрь 07, 2011, 18:08
Ну да, бездумно поделить на 2 - верных подход. Вот у нас ракеты да спутники и падают ;D


Название: Re: paint система координат
Отправлено: danquimby от Ноябрь 08, 2011, 08:22
Ну да, бездумно поделить на 2 - верных подход. Вот у нас ракеты да спутники и падают ;D

дело не в бездумности,просто я пытался сделать, как ты сказал.
Но все приводит к (0,0)
у меня просто руки опустились.


Название: Re: paint система координат
Отправлено: iroln от Ноябрь 08, 2011, 16:13
(0,0) будет, если будешь делать так:
Код
C++ (Qt)
item.mapFromScene(item.pos())

Если у тебя нет понимания, что происходит, то в следующий раз деление на 2 тебе не поможет.
В инструментарии GraphicsView есть такой графический элемент QGraphicsRectItem. Так вот, его метод pos() возвращает координаты, привязанные к значению rect().
То есть, например:
Есть сцена, ты на неё добавил QGraphicsRectItem [10 10 20 20] с помощью метода сцены addRect(10, 10, 20, 20)

Если ты после этого вызовешь метод pos() добавленного элемента прямоугольника, то получишь (0,0), а не (10,10), так как значение позиции будет привязано к первоначально установленной позиции rect и будет изменяться относительно её. Значение pos будет сбрасываться в ноль каждый раз при вызове метода setRect() элемента прямоугольника. Я не знаю почему так сделано, это некая особенность инструментария и QGraphicsRectItem. Тебе нужно понять, что происходит в твоём случае. Возможно, ты что-то не так понимаешь или делаешь, а возможно это какой-то баг, который проявляется в определённом случае.



Название: Re: paint система координат
Отправлено: ufna от Ноябрь 08, 2011, 16:22
все правильно в инструментарии :) т.к. есть еще и вращение, вокруг центра. так что у айтема есть свой Pivot point, т.е. точка отсчета.


Название: Re: paint система координат
Отправлено: iroln от Ноябрь 08, 2011, 16:27
Это понятно, но на счёт правильности сомневаюсь.

При перемещении QGraphicsRectItem мышкой значение rect меняться не будет. Будет меняться только pos() относительно установленного значение rect. Согласитесь, это не очень то логично. Перемещая прямоугольник по сцене я надеюсь получить значение rect в зависимости от расположения на сцене, а не от текущего значения pos. А так приходится прибавлять значение pos к значению rect. Возможно, так сделано для упрощения трансформаций, но пользоваться этим не очень то удобно, особенно когда этого не знаешь. :)


Название: Re: paint система координат
Отправлено: _OLEGator_ от Ноябрь 08, 2011, 16:35
Я не знаю почему так сделано, это некая особенность инструментария и QGraphicsRectItem.

Это особенность работы всего механизма, соответственно любого QGraphicsItem.