Название: QGraphicsScene/QGraphicsView: выделение части изображения Отправлено: Hvzh от Октябрь 19, 2015, 15:16 Доброго времени суток!
Имеется изображение, которое грузится в QGraphicsScene и отображается в QGraphicsView. Необходимо обеспечить возможность выделения прямоугольной части изображения и сохранения ее в файл. Может, кто сталкивался? Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения Отправлено: Nidxogg от Октябрь 19, 2015, 17:00 Один из вариантов:
-Создать подкласс QGraphicsScene -Переопределить mousePress/Move/Release event-ы В press задается начальная точка (qt пример DiagramScene посмотрите) в move рисуется выделяющий прямоугольник в release получаете конечную точку и координаты выделенного прямоугольника соответственно -заренделить выбранную область Примерно так (только использовать координаты прямоугольника естественно) Код:
Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения Отправлено: Bepec от Октябрь 19, 2015, 17:06 А можно повесить евент фильтр с тем же результатом, но это уже просто разные варианты с одинаковым результатом :)
Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения Отправлено: Nidxogg от Октябрь 19, 2015, 17:10 А можно повесить евент фильтр с тем же результатом, но это уже просто разные варианты с одинаковым результатом :) Через евент фильтр не пробовалНазвание: Re: QGraphicsScene/QGraphicsView: выделение части изображения Отправлено: Hvzh от Октябрь 19, 2015, 17:14 Спасибо, завтра буду пробовать
Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения Отправлено: Hvzh от Октябрь 19, 2015, 17:36 Вдогонку еще вопрос (я с QGraphicsScene/QGraphicsView столкнулся сегодня в первый раз). Загрузил я, скажем, изображение (оно большое, поэтому видна только его часть), средствами QGraphicsView повернул его на 90 градусов. После этого нужно его сохранить в повернутом виде. Если я сохраняю QImage(ui->graphicsView->viewport()->rect().size(), QImage::Format_ARGB32), то сохраняется только видимая часть изображения, а вот так - QImage image(scene->sceneRect().size().toSize(), QImage::Format_ARGB32) - исходное, не повернутое...
Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения Отправлено: Old от Октябрь 19, 2015, 19:22 Через евент фильтр не пробовал И не надо.Фильтр событий это экстренный вариант решения проблемы, но не как ни штатное средство разработки. Когда, вы делаете полноценный виджет обрабатывающий события, то вы знаете, что если этот виджет в фокусе, то все события адресуются в первую очередь ему. А при использовании фильтров событий, обработчик события можно поместить в какой-то объект, который и виджетом не будет являться и он будет обрабатывать события, а вы судорожно разбираться, почему до какого-то виджета не доходят какие-то события вообще. И чем больше у вас будет навешено фильтров, тем сложнее с этим хозяйством будет разбираться. Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения Отправлено: Bepec от Октябрь 19, 2015, 20:00 Old вы немного не правы.
EventFilter - это стандартный способ внести изменения в стандартную обработку, НЕ ОТКЛЮЧАЯ её и не производя фигню с наследованием ради пары функций, что ущербно. Никто не мешает дальше посылать события виджетам как обычно, а то что вы привели это просто код программистов, которые не читали описания к eventFilter :) Просто будет надстройка, на их основании производящая какие то действия. PS даже сотня фильтров не изменит поведение стандартных виджетов, если не будут глотать события :) Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения Отправлено: Old от Октябрь 19, 2015, 20:10 EventFilter - это стандартный способ внести изменения в стандартную обработку, НЕ ОТКЛЮЧАЯ её и не производя фигню с наследованием ради пары функций, что ущербно. Можно наследоваться и ради одной функции и это будет лучшим решением. Количество переопределяемых функций не имеет никакого значения.И то, что это средство доступно, вовсе не означает, что его нужно пихать во все места. Это по настоящему - ущербно. Никто не мешает дальше посылать события виджетам как обычно, а то что вы привели это просто код программистов, которые не читали описания к eventFilter :) Я привел то, что происходит в больших проектах, когда все кто угодно пытаются навешивать фильтры на все, что только можно. Потом, они месяцами не могут найти причины не прихода событий куда надо, а потом все дружно мы находим фильтр событий установленный куда нибудь на главное окно или объект QApplication, который по неведомым никому правилам пытался "обрабатывать" какие-то события. PS даже сотня фильтров не изменит поведение стандартных виджетов, если не будут глотать события :) Ну вот ТС нужно что бы обработчик, в вашей терминологии, глотал события.Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения Отправлено: Bepec от Октябрь 19, 2015, 20:48 Old давайте не будем спорить - это официальный и доступный и удобный способ. Всякие "наследоваться и менять функцию" - это так же губительно при кривых руках.
Специально для вас - проект маленький, человек учится, и да - все все изменения отслеживаются при помощи Ctrl+F "eventFilter". Вместо сотен классов огромного проекта, в каждом из которых будет переопределено по 1 функции. Не надо писать - "Это плохой способ", "это ЛУЧШЕЕ решение", "Хрен потом найдешь". Надо писать - это один из вариантов, который ВАМ лично не нравится, ВЫ считаете его худшим и ВЫ хрен потом найдете куда события улетают :) Ну или приводите пруфы от титанов Qt/C++. PS а на деле мало данных от ТСса, возможно он работает с изображением как с QGraphicsItem(или одним его специализированным предком), так что вариант с View лишь наши догадки :) Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения Отправлено: Old от Октябрь 19, 2015, 20:53 Ну или приводите пруфы от титанов Qt/C++. Верес, я совершенно не собираюсь вам ничего доказывать, тем более приводить пруфы от непонятных людей. :)Делайте как угодно. Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения Отправлено: Bepec от Октябрь 19, 2015, 20:55 Просто младые умы, будут считать ваши откровения истиной в первой инстанции. Вместо того, чтобы попробовать самим :D
Ну да не суть :) Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения Отправлено: Old от Октябрь 19, 2015, 20:57 Просто младые умы, будут считать ваши откровения истиной в первой инстанции. Вместо того, чтобы попробовать самим :D Они будут осторожны и не будут этот механизм сувать во все места. А для небольших "корректировок" он очень удобен.Ну да не суть :) Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения Отправлено: Hvzh от Октябрь 20, 2015, 09:27 Видимо, придется дать более детальное описание проекта. Проект представляет собой систему самостоятельного сканирования. Пользователь сканирует, например, книгу. Скан сохраняется в виде Jpeg-файла. При этом средствами OpenCV производится обрезка фона, при необходимости разбивка на правую-левую страницы. Полученные сканы отображаются в виде thumbnail'ов в галерее. Далее, пользователь может кликнуть на одном из thumbnail'ов, после чего изображение выводится в окно редактирования. Пользователь может повернуть изображение, изменить его яркость, резкость, контраст. Все это опять же делается средствами OpenCV. А вот вывод результирующего изображения в окно редактирования делается так:
Код: imageLabel->setPixmap(QPixmap::fromImage(img.scaled(this->width(), this->height(), Qt::KeepAspectRatio))); Для описанных выше преобразований изображения данный метод его вывода вполне приемлем. Однако не так давно возникла необходимость в добавлении еще двух функций редактирования: увеличение части изображения и вырезание прямоугольной части изображения с последующим ее сохранением. Вот я и ломаю голову, каким образом имплементировать эти две функции. Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения Отправлено: Bepec от Октябрь 20, 2015, 12:45 Прикольно, имеется imageLabel. Интересно какого оно типа :D
Мб не стоит использовать QGraphicsView/Scene с такой задачей? Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения Отправлено: Hvzh от Октябрь 20, 2015, 12:50 Прикольно, имеется imageLabel. Интересно какого оно типа :D Мб не стоит использовать QGraphicsView/Scene с такой задачей? А я и не использовал до недавнего времени. А imageLabel - это обычный QLable. Мне его вполне хватало. И заказчика все устраивало. Но я совершенно не понимаю, как в свете того концепта реализовать эти две дополнительные функции. Поэтому и решил попробовать заменить QLabel на QGraphicsView/Scene. |