Добрый день.
Пытаюсь сделать экранную лупу - есть превьюшка, которое загружено в QGraphicsPixmapItem, есть большое, которое загружается по необходимости, есть QGraphicsScene и QGraphicsView соответственно.
Собственно лупу я делаю следующим образом
//получаю соответствие точки малого изображения на которой щелкнули и точки большого
QPoint pt_full=displayToPhoto(pt,is_left);
//создаю на основе полного изображения маску, чтобы сделать непрозрачной только область вокруг нужной точки
int zoomRadius=100;
QBitmap mask(fullImage->pixmap().size());
QPainter painter;
painter.begin(&mask);
painter.setBrush(Qt::SolidPattern);
painter.drawEllipse(pt_full,zoomRadius,zoomRadius);
painter.end();
//устанавливаю маску
fullImage.setMask(mask);
fullImageItem->setPixmap(fullImage);
//двигаю превьюшку так, чтобы центр лупы совпал с той точкой, на которой я щелкал
previewItem->setOffset(pt_full-pt);
view->ensureVisible(previewItem,0,0);
И тут появляется два вопроса
1. Я вообще логичный способ выбрал или изобретаю адский велосипед и это можно сделать проще?
2. Высота previewItem в общем случае меньше, чем высота view, поэтому при ensureVisible превьюшка прыгает вверх-вниз по виджету, что очень неудобно. Как сделать так, чтобы она всегда выравнивалась, скажем, по высоте?
Попытка сделать
QPointF pos=previewItem->scenePos();
QPointF center=QPoint(previewItem->pixmap().width()/2,preview->pixmap().height()/2);
view->centerOn(pos+center);
привела к тому, что view прокручивается куда-то, где превьюшку вообще не видно (видимо я неправильно либо получаю координаты, либо перехожу к ним)