В примере картинка будет вращаться вокруг своего центра при перемещении курсора мыши (если нажата правая кнопка) и изменять масштаб, при вращении колеса (если курсор находится над картинкой). Для растрового изображения в Graphics View Framework есть специальный класс QGraphicsPixmapItem, поэтому нужно создать его потомка, и переопределить обработчики событий: wheelEvent, mousePressEvent, mouseMoveEvent. По умолчанию у QGraphicsPixmapItem начало локальной системы координат находится в верхнем левом углу, из-за чего картинка будет вращаться вокруг верхнего левого угла, а при увеличении масштаба ползти вниз. Для того чтобы перенести начало локальной системы координат в центр нужно после создания объекта QGraphicsPixmapItem вызвать функцию setOffset:
Item->setOffset(-0.5*QPointF(pixmap.width(), pixmap.height()));
Угол на который нужно повернуть изображение при перемещении курсора мыши будет определён из формулы векторного произведения ОМ и ОМ
0:

где
М
0(х
0, у
0) — начальная координата мыши;
М(х, у) — текущая координата мыши;
О(0, 0) — центр картинки.
void PicItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
if ( event->button() == Qt::RightButton )
{
lastPos = event->pos();
return;
}
QGraphicsPixmapItem::mousePressEvent(event);
}
void PicItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
if (event->buttons() & Qt::RightButton)
{
qreal det = lastPos.x() * event->pos().y() - lastPos.y() * event->pos().x();
qreal mod_a = sqrt(pow(lastPos.x(), 2) + pow(lastPos.y(), 2));
qreal mod_b = sqrt(pow(event->pos().x(), 2) + pow(event->pos().y(), 2));
qreal angle = asin(det / (mod_a * mod_b)) * 180 / M_PI;
rotate(angle);
return;
}
QGraphicsPixmapItem::mouseMoveEvent(event);
}
Изменения масштаба с помощью колеса мыши намного проще. По знаку event->delta() определяет в какую сторону было вращение колеса и соответственно увеличиваем или уменьшаем масштаб:
void PicItem::wheelEvent(QGraphicsSceneWheelEvent * event)
{
if ( hasFocus() )
{
qreal fd_xy = (event->delta() > 0)?1.01:0.99;
scale(fd_xy, fd_xy);
}
}
Полный исходник в архиве 3742933_rotate_zoom.rar.