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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Поворот QGraphicsItemGroup.  (Прочитано 6738 раз)
Lunex.08
Гость
« : Июнь 06, 2011, 09:19 »

День добрый.
Проблема в следующем: при каждом вызове одного слота, мне нужно создавать группу QGraphicsItemGroup из разных итемов и сделать поворот(на 90 град.) относительно начала системы координат группы. Причем у итемов может быть разное положение в сцене, но они касаются друг друга. Пробовал разные варианты - все равно поворот идет относительно сцены, точки 0,0.
Набросочек:
Код:
void View::rotate()
{
    QGraphicsItemGroup *group = new QGraphicsItemGroup;

    group->setPos(figure_one->pos().x(), figure_one->pos().y());

    group = scene->createItemGroup(scene->items(group->mapToItem(group, group->pos().x()-20, group->pos().y()-20, 100, 80)));
 
    group->setRotation(90);
    scene->destroyItemGroup(group);
}
Это, тксказать, место толчка. Пробовал разные преобразования систем координат у итемов, группы, но все бес толку. Что делать?
Записан
twp
Гость
« Ответ #1 : Июнь 06, 2011, 13:03 »

может поможет void QGraphicsItem::setTransformOriginPoint ( const QPointF & origin )
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июнь 06, 2011, 14:28 »

Не проверял, но по смыслу должно быть
Код
C++ (Qt)
void Rotate( QGraphicsItem & item, qreal angle_degree, const QPointF & center )
{
QTransform t1, t2, t3;
t1.translate(-center.x(), -center.y());
t2.rotate(angle_degree);
t3.translate(center.x(), center.y());
item.setTransform(t1 * t2 * t3);
}
 
Записан
Lunex.08
Гость
« Ответ #3 : Июнь 08, 2011, 10:53 »

Хм. Идея меня в обоих случаях устраивает. Но реализацию сделать не могу.
К примеру:
Код:
void View::Rotate()
{
   QGraphicsItemGroup *group = new QGraphicsItemGroup;
   //group->setPos(figure_one->pos().x()-20, figure_one->pos().y()-20);
   group->setTransformOriginPoint(figure_one->pos().x(), figure_one->pos().y());
   group = scene->createItemGroup(scene->items(figure_one->pos().x()-20, figure_one->pos().y()-20, 80, 60));
   group->rotate(90);
   scene->destroyItemGroup(group);
}

И я вроде понимаю где ошибка: у итемов в группе значения x и y имеют прежние большие величины, т.е. координаты сцены. Если я правильно понял, как это исправить?
« Последнее редактирование: Июнь 08, 2011, 11:10 от Lunex.08 » Записан
Zartul
Гость
« Ответ #4 : Июнь 08, 2011, 16:59 »

попробуйте использовать ф-ю трансформации для поворота относительно заданой точки

в ассистенте вроде так пишут:
Цитировать
 // Поворачивает элемент на 45 градусов вокруг (x, y).
 item->setTransform( QTransform().translate( x, y ).rotate( 45 ).translate( -x, -y ) );

Код
C++ (Qt)
  QGraphicsItemGroup *group = new QGraphicsItemGroup;
  //group->setPos(figure_one->pos().x()-20, figure_one->pos().y()-20);
  group = scene->createItemGroup(scene->items(figure_one->pos().x()-20, figure_one->pos().y()-20, 80, 60));
  group->setTransform( QTransform().translate( figure_one->pos().x(), figure_one->pos().y() ).rotate( 90).translate( -x, -y ) );
  scene->destroyItemGroup(group);

или посмотрите относительно каких координат поворачиваете, может точку надо перемапить с координат сцены в координаты итема...
« Последнее редактирование: Июнь 08, 2011, 17:02 от Zartul » Записан
Lunex.08
Гость
« Ответ #5 : Июнь 09, 2011, 17:31 »

попробуйте использовать ф-ю трансформации для поворота относительно заданой точки

в ассистенте вроде так пишут:
Цитировать
  // Поворачивает элемент на 45 градусов вокруг (x, y).
 item->setTransform( QTransform().translate( x, y ).rotate( 45 ).translate( -x, -y ) );

Код
C++ (Qt)
  QGraphicsItemGroup *group = new QGraphicsItemGroup;
  //group->setPos(figure_one->pos().x()-20, figure_one->pos().y()-20);
  group = scene->createItemGroup(scene->items(figure_one->pos().x()-20, figure_one->pos().y()-20, 80, 60));
  group->setTransform( QTransform().translate( figure_one->pos().x(), figure_one->pos().y() ).rotate( 90).translate( -x, -y ) );
  scene->destroyItemGroup(group);

или посмотрите относительно каких координат поворачиваете, может точку надо перемапить с координат сцены в координаты итема...
Товарищ, от всей души благодарю! Верите\нет, я за час до вашего сообщения этот пример просмотрел, скопировал его. И не работал. А не фурычило потому, что не до конца строку с кодом выделил. И часть обрезал. Поэтому и поворот шел лишь с одной стороны, все время смещая фигуру по оси y. А щас все тип-топ. Еще раз благодарю! Подмигивающий

Не проверял, но по смыслу должно быть
Код
C++ (Qt)
void Rotate( QGraphicsItem & item, qreal angle_degree, const QPointF & center )
{
QTransform t1, t2, t3;
t1.translate(-center.x(), -center.y());
t2.rotate(angle_degree);
t3.translate(center.x(), center.y());
item.setTransform(t1 * t2 * t3);
}
 

Идея та же самая, только поворот идет против часовой стрелки.  И вам спасибо за помощь!
« Последнее редактирование: Июнь 09, 2011, 17:35 от Lunex.08 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июнь 09, 2011, 18:22 »

Идея та же самая, только поворот идет против часовой стрелки. 
Так это нормально/общепринято, положительный угол поворота поворачивает против часовой стрелки ("правая" система координат). Так в <math.h> и везде
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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