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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: проблема с TransformOriginPoint  (Прочитано 2788 раз)
alexey11111
Гость
« : Март 07, 2013, 17:43 »

Друзья, подскажите где собака порылась.
Есть объект класса, унаследованного от QGraphicsItem - квадратик. Этот квадратик можно вращать колесиком мышки, а также изменять его размер, потянув за бока. Проблема в том, что если квадратик сначала повернуть, затем изменить его размер, а затем опять повернуть, то он при повороте сначала перескакивает  в некоторую близлежащую точку, а затем начинает нормально вращаться. Видимо, проблема с координатами в setTransformOriginPoint.
В аттаче проект: Cropper - это, собственно, интересующий квадратик. Resizer - это объекты на боках квадратика для изменения размеров. Вращение реализовано через перекрытие wheelEvent в Cropper.
Если нетрудно, подскажите что не так.
Записан
ConConovaloff
Гость
« Ответ #1 : Март 07, 2013, 23:56 »

Добрый день,

Я не изучал еще 2d отрисовку и не могу подсказать правильный код.
Но происходит следующее:

В первом варианте, если закомментировать setTransformOriginPoint определяющую точку вокруг которой поворачивается изображение, то скачков не будет.
Потому что - верхняя левая точка от которой рисуется квадрат всегда будет на своем месте. И при растяжение и при повороте, точка откуда считается квадрат неподвижна.

В вашем варианте, когда вы поворачиваете квадрат с setTransformOriginPoint, точка от которой рисуется квадрат все еще остается на прежнем месте, а левый-верхний угол квадрата отворачивается от нее. При этом, когда наклон квадрата 0 (или 360), его верхний левый угол должен соответствовать точке 0, 0. При изменение размера + повороте, квадрат смещается, чтобы соответствовать этой точке.

Одним из возможных решениев будет - избавиться от setTransformOriginPoint и рисовать квадрат в минус, чтобы середина отрисовки была в середине квадрата:

Код
C++ (Qt)
QRectF Cropper::boundingRect() const
{
   return QRectF(0 - width/2, 0 - height/2, width, height);
}
 
« Последнее редактирование: Март 08, 2013, 03:45 от ConConovaloff » Записан
alexey11111
Гость
« Ответ #2 : Март 08, 2013, 00:40 »

ConConovaloff, спасибо, это работает. Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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