Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Crazy Sage от Июль 30, 2012, 18:50



Название: Создание экранной лупы
Отправлено: Crazy Sage от Июль 30, 2012, 18:50
Добрый день.
Пытаюсь сделать экранную лупу - есть превьюшка, которое загружено в 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 прокручивается куда-то, где превьюшку вообще не видно (видимо я неправильно либо получаю координаты, либо перехожу к ним)


Название: Re: Создание экранной лупы
Отправлено: Bepec от Июль 31, 2012, 06:45
Я бы посоветовал вам посмотреть исходники примера pixeltool.
По сути она тоже экранная лупа.

По идее, если у неё сетку убрать, то будет просто лупа.


Название: Re: Создание экранной лупы
Отправлено: Crazy Sage от Июль 31, 2012, 07:02
Ок, гляну. Этот пример не видел еще.


Название: Re: Создание экранной лупы
Отправлено: Crazy Sage от Июль 31, 2012, 07:33
Посмотрел, не подходит. У меня обязательное условие в двух картинках, потому что это большая исходная фотография и ужатая превьюшка, которая нужна, чтобы не таскать за собой гигабайты фотографий. Поэтому попиксельное увеличение мне не подходит, должно быть видно качество именно исходной фотографии.
Может вырезать как-нибудь из исходной фотографии прямоугольник, который должен перекрывать превьюшку и уже от него оставлять видимым кружок?


Название: Re: Создание экранной лупы
Отправлено: Bepec от Июль 31, 2012, 07:41
Ну так у вас же изображение в памяти. Делайте что хотите - хоть крестики-нолики вырезайте, хоть попиксельно сдвигайте :)
Ужимайте и показывайте превьюшку.

PS хотя какой кружок вам нужен я не понял :)


Название: Re: Создание экранной лупы
Отправлено: Crazy Sage от Июль 31, 2012, 07:56
Ну в смысле, что на уменьшенном изображении выставляется окружность, внутри которой отображается кусок полноразмерного изображения.
Понятно, что могу делать что хочу)))
Просто сходу не получается, а в графической системе qt пока слабоват, вот и решил проверить, может я велосипед изобретаю.
В общем буду дальше экспериментировать.


Название: Re: Создание экранной лупы
Отправлено: Bepec от Июль 31, 2012, 08:02
Иногда велосипед необходим. Чтобы потом построить машинку ;)

PS если не жалко, выложи что получилось :) В графике я откровенно слабоват, хоть посмотрю со стороны :D


Название: Re: Создание экранной лупы
Отправлено: Crazy Sage от Июль 31, 2012, 08:06
Доведу до ума - выложу.


Название: Re: Создание экранной лупы
Отправлено: Bepec от Июль 31, 2012, 10:54
Буду ждать с надеждой.  :P


Название: Re: Создание экранной лупы
Отправлено: Crazy Sage от Август 09, 2012, 11:34
http://cannonfodder.su/pub/Zoom.zip
не сказать, чтобы совсем доведено до ума, но в целом работает
изначально лупы нет, появляется по щелчку