1. Цель
Мой коллега и я пытались визуализировать вращающиеся эллипсоиды в Qt. Типичный подход к решению, как мы его понимаем, состоит в смещении центра эллипсоидов в начало системы координат, выполнении вращения там и смещении назад:
http://qt-project.org/doc/qt-4.8/qml-rotation.html
2. Пример кода
Основываясь на решении, указанном в ссылке выше, мы создали следующий пример кода:
// Constructs and destructors
RIEllipse(QRect rect, RIShape* parent, bool isFilled = false)
: RIShape(parent, isFilled), _rect(rect), _angle(30)
{}
// Main functionality
virtual Status draw(QPainter& painter)
{
const QPen& prevPen = painter.pen();
painter.setPen(getContColor());
const QBrush& prevBrush = painter.brush();
painter.setBrush(getFillBrush(Qt::SolidPattern));
// Get rectangle center
QPoint center = _rect.center();
// Center the ellipse at the origin (0,0)
painter.translate(-center.x(), -center.y());
// Rotate the ellipse around its center
painter.rotate(_angle);
// Move the rotated ellipse back to its initial location
painter.translate(center.x(), center.y());
// Draw the ellipse rotated around its center
painter.drawEllipse(_rect);
painter.setBrush(prevBrush);
painter.setPen(prevPen);
return IL_SUCCESS;
}
Как видите, в этом тестовом образце мы жестко закодировали угол поворота до 30 градусов.
3. Наблюдения
Эллипсы выходят в неправильных положениях, часто за пределами области холста.
4. Вопрос
Что не так в приведенном выше примере кода?
С наилучшими пожеланиями,
Baldur
Постскриптум Заранее спасибо за любой конструктивный ответ?
P.P.S. Прежде чем опубликовать это сообщение, мы довольно много раз искали на stackoverflow.com.
Перемещение / вращение изображения Qt казалось, отражает подход решения, подобный ссылке выше.
В painter.translate(center.x(), center.y());
вы сдвигаете свой объект на величину текущей координаты, которая составляет (2*center.x(), 2*center.y())
в следствии. Вам может понадобиться:
painter.translate(- center.x(), - center.y());
Теория перемещения объекта обратно к его началу, вращения и затем замены положения объекта верна. Однако код, который вы представили, вовсе не переводит и не вращает объект, а переводит и вращает художника. В примере вопроса, который вы упоминается, они хотят повернуть все изображение объекта, поэтому перед поворотом они перемещают художника в центр объекта.
Самый простой способ поворота объекта GraphicsItem состоит в том, чтобы изначально определить элемент с центром в центре объекта, а не в его верхнем левом углу. Таким образом, любое вращение будет автоматически происходить вокруг центра объекта, без необходимости перемещать объект.
Чтобы сделать это, вы должны определить элемент с ограничительным прямоугольником для x, y, width, height с помощью (-width / 2, -height / 2, width, height).
В качестве альтернативы, если ваш элемент унаследован от QGraphicsItem или QGraphicsObject, вы можете использовать функцию setTransformOriginPoint перед любым поворотом.