Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: alexey11111 от Март 07, 2013, 17:43



Название: проблема с TransformOriginPoint
Отправлено: alexey11111 от Март 07, 2013, 17:43
Друзья, подскажите где собака порылась.
Есть объект класса, унаследованного от QGraphicsItem - квадратик. Этот квадратик можно вращать колесиком мышки, а также изменять его размер, потянув за бока. Проблема в том, что если квадратик сначала повернуть, затем изменить его размер, а затем опять повернуть, то он при повороте сначала перескакивает  в некоторую близлежащую точку, а затем начинает нормально вращаться. Видимо, проблема с координатами в setTransformOriginPoint.
В аттаче проект: Cropper - это, собственно, интересующий квадратик. Resizer - это объекты на боках квадратика для изменения размеров. Вращение реализовано через перекрытие wheelEvent в Cropper.
Если нетрудно, подскажите что не так.


Название: Re: проблема с TransformOriginPoint
Отправлено: ConConovaloff от Март 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);
}
 


Название: Re: проблема с TransformOriginPoint
Отправлено: alexey11111 от Март 08, 2013, 00:40
ConConovaloff, спасибо, это работает. :)