• Авторизация


Вращение и изменения масштаба изображения с помощью мыши в Graphics View Framework 16-07-2009 23:29 к комментариям - к полной версии - понравилось!


   В примере картинка будет вращаться вокруг своего центра при перемещении курсора мыши (если нажата правая кнопка) и изменять масштаб, при вращении колеса (если курсор находится над картинкой). Для растрового изображения в Graphics View Framework есть специальный класс QGraphicsPixmapItem, поэтому нужно создать его потомка, и переопределить обработчики событий: wheelEvent, mousePressEvent, mouseMoveEvent. По умолчанию у QGraphicsPixmapItem начало локальной системы координат находится в верхнем левом углу, из-за чего картинка будет вращаться вокруг верхнего левого угла, а при увеличении масштаба ползти вниз. Для того чтобы перенести начало локальной системы координат в центр нужно после создания объекта QGraphicsPixmapItem вызвать функцию setOffset:

Item->setOffset(-0.5*QPointF(pixmap.width(), pixmap.height()));


   Угол на который нужно повернуть изображение при перемещении курсора мыши будет определён из формулы векторного произведения ОМ и ОМ0:





где

  М00, у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);
}
}



Еще информация по "Каркасу графического отображения" (Graphics View Framework):


http://doc.crossplatform.ru/qt/4.3.5/graphicsview.html
http://symmetrica.net/qt4/lesson4.htm


Полный исходник в архиве 3742933_rotate_zoom.rar.
вверх^ к полной версии понравилось! в evernote
Комментарии (1):


Комментарии (1): вверх^

Вы сейчас не можете прокомментировать это сообщение.

Дневник Вращение и изменения масштаба изображения с помощью мыши в Graphics View Framework | whitewin - Дневник whitewin | Лента друзей whitewin / Полная версия Добавить в друзья Страницы: раньше»