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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Поворот элемента на графической сцене  (Прочитано 2904 раз)
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« : Сентябрь 02, 2016, 12:45 »

Здравствуйте!
Есть у меня на сцене объект -- карточка с двумя сторонами и дополнительные объекты -- текст и картинки.
Карта находится в горизонтальной ориентации.

Понадобилось ее развернуть в портретную (картинка 2), так чтобы текстовые элементы оставались в верхнему углу (для текущей стороны).

Карту разворачиваю так:
Код
Java
QPointF center = card.boundingRect().center();
com.trolltech.qt.gui.QTransform transform = new com.trolltech.qt.gui.QTransform();
 
if (check) {
   transform.translate(center.x(), center.y())
            .rotate(-90)
            .translate(-center.x(), -center.y());
 
} else {
   transform.translate(center.x(), center.y())
            .rotate(90)
            .translate(-center.x(), -center.y());
}
card.setTransform(transform, true);
 

А обновляю координаты элементов так (в методе элемента):
Код
Java
QPointF pos_px = ...;
final CardSideID1 side = front ? card.frontSide : card.backSide;
pos_px = side.mapToScene(pos_px);
 
super.setPos(pos_px);  
 

В горизонтальной эта работало, а как сделать в вертикальной?

ЗЫ. красная точка -- координата 0,0 сцены

UPDATE.
Сделал и прикладываю минимальный проект на с++, помогите разобраться Улыбающийся
« Последнее редактирование: Сентябрь 14, 2016, 09:42 от gil9red » Записан

gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Сентябрь 06, 2016, 10:25 »

Частично разобрался с проблемами, прикладываю проект и скриншоты.
Но теперь нужно сделать так, чтобы часть элементов при повороте оставались на своих местах и вместе с картой поворачивались, другая часть (как сейчас) оставалась горизонтальной.

Приложил отредактированный скриншот, показывающей чего хочу сделать.


Подскажите/покажите как это реализовать?

Никто с сценой не работал и не может поделиться опытом? Грустный утомился уже с этим Плачущий
« Последнее редактирование: Сентябрь 06, 2016, 12:38 от gil9red » Записан

gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Сентябрь 13, 2016, 15:38 »

Трудно поверить, что это задание, с виду казавшееся пустячковым, убило недели времени Веселый




Для того, чтобы элементы по флагу поворачивались с картой (назовем их зафиксированными) или распалагались на ней с учетом расположения на нового верхнего угла карты нужно было сделать:

  • Все элементы располагать на сцене
  • Размещение всех элементов происходит вручную
  • Для зафиксированных элементов поворот выполняется вручную

Карту поворачивал так:

Код
C++ (Qt)
// Поворот всей карты
QPointF center = card->boundingRect().center();
QTransform transform;
 
if (checked) {
   transform.translate(center.x(), center.y())
            .rotate(-90)
            .translate(-center.x(), -center.y());
 
} else {
   transform.translate(center.x(), center.y())
            .rotate(90)
            .translate(-center.x(), -center.y());
}
card->setTransform(transform, true);
 
card->isLandscape = !checked;
 
needRotate = true;
on_actionFill_triggered();
 
Размещение элементов на карте выполняется вручную с учетом того с какой стороне карты находится элемент и является ли он зафиксированным:

Код
C++ (Qt)
for (TextElement* item: items) {
   QPointF pos(item->_x, item->_y);
   CardSide* side = item->isFrontSide ? card->frontSide : card->backSide;
 
   if (!item->isFixedPos) {
       // Альбомная ориентация
       if (card->isLandscape) {
           pos = side->pos() + pos;
 
       // Портретная ориентация
       } else {
           QPointF posSide = card->mapToScene(side->pos() + side->boundingRect().topRight());
           pos = posSide + pos;
       }
 
   } else {
       // Поворот зафиксированного элемента
       QTransform transform;
 
       // временный костыль
       if (needRotate)
       if (!card->isLandscape) {
           transform.rotate(-90);
       } else {
           transform.rotate(90);
       }
       item->setTransform(transform, true);
 
       if (card->isLandscape) {
           pos = side->pos() + pos;
 
       } else {
           QPointF posSide = card->mapToScene(side->pos());
           pos = QPointF(posSide.x() + pos.y(), posSide.y() - pos.x());
       }
   }
 
   item->setPos(pos);
}
 

Тестовый проект.
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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