Russian Qt Forum
Сентябрь 30, 2024, 14:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: paint система координат  (Прочитано 8279 раз)
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 это были координаты сцены.
Записан
danquimby
Гость
« Ответ #1 : Ноябрь 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


ничего не понимаю
Записан
danquimby
Гость
« Ответ #2 : Ноябрь 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);
}

перелазил форум что то врузумительное не нашел
Записан
iroln
Гость
« Ответ #3 : Ноябрь 06, 2011, 18:49 »

А метод scenePos() возвращает то же самое значение, что и pos()? Просто значение, которое возвращает pos() находится в системе координат предка элемента. Если у ваших элементов нет предков, то должно возвращаться значение позиции элемента в координатах сцены.

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

Метод pos() возвращает координаты верхнего левого угла картинки в координатах сцены. Всё верно.
Записан
iroln
Гость
« Ответ #4 : Ноябрь 06, 2011, 19:03 »

И зачем надо делать mapFromScene()?
Этот метод переводит точку из координат сцены в координаты элемента.

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

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

То есть начало координат в данном случае начинается от верхнего левого угла элемента.
« Последнее редактирование: Ноябрь 06, 2011, 19:05 от iroln » Записан
danquimby
Гость
« Ответ #5 : Ноябрь 07, 2011, 12:16 »

попробовал, результат (0,0)
но одно понял что Xpos \ 2 верный подход
проверял на 4х машинах разные windows результат
верный
Записан
iroln
Гость
« Ответ #6 : Ноябрь 07, 2011, 18:08 »

Ну да, бездумно поделить на 2 - верных подход. Вот у нас ракеты да спутники и падают Смеющийся
Записан
danquimby
Гость
« Ответ #7 : Ноябрь 08, 2011, 08:22 »

Ну да, бездумно поделить на 2 - верных подход. Вот у нас ракеты да спутники и падают Смеющийся

дело не в бездумности,просто я пытался сделать, как ты сказал.
Но все приводит к (0,0)
у меня просто руки опустились.
Записан
iroln
Гость
« Ответ #8 : Ноябрь 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. Тебе нужно понять, что происходит в твоём случае. Возможно, ты что-то не так понимаешь или делаешь, а возможно это какой-то баг, который проявляется в определённом случае.

« Последнее редактирование: Ноябрь 08, 2011, 16:16 от iroln » Записан
ufna
Гость
« Ответ #9 : Ноябрь 08, 2011, 16:22 »

все правильно в инструментарии Улыбающийся т.к. есть еще и вращение, вокруг центра. так что у айтема есть свой Pivot point, т.е. точка отсчета.
Записан
iroln
Гость
« Ответ #10 : Ноябрь 08, 2011, 16:27 »

Это понятно, но на счёт правильности сомневаюсь.

При перемещении QGraphicsRectItem мышкой значение rect меняться не будет. Будет меняться только pos() относительно установленного значение rect. Согласитесь, это не очень то логично. Перемещая прямоугольник по сцене я надеюсь получить значение rect в зависимости от расположения на сцене, а не от текущего значения pos. А так приходится прибавлять значение pos к значению rect. Возможно, так сделано для упрощения трансформаций, но пользоваться этим не очень то удобно, особенно когда этого не знаешь. Улыбающийся
Записан
_OLEGator_
Гость
« Ответ #11 : Ноябрь 08, 2011, 16:35 »

Я не знаю почему так сделано, это некая особенность инструментария и QGraphicsRectItem.

Это особенность работы всего механизма, соответственно любого QGraphicsItem.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.191 секунд. Запросов: 21.