Russian Qt Forum
Ноябрь 22, 2024, 18:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QGraphicsScene/QGraphicsView: выделение части изображения  (Прочитано 10944 раз)
Hvzh
Гость
« : Октябрь 19, 2015, 15:16 »

Доброго времени суток!
Имеется изображение, которое грузится в QGraphicsScene и отображается в QGraphicsView. Необходимо обеспечить возможность выделения прямоугольной части изображения и сохранения ее в файл. Может, кто сталкивался?
Записан
Nidxogg
Гость
« Ответ #1 : Октябрь 19, 2015, 17:00 »

Один из вариантов:
-Создать подкласс QGraphicsScene
-Переопределить mousePress/Move/Release event-ы
В press задается начальная точка (qt пример DiagramScene посмотрите)
в move рисуется выделяющий прямоугольник
в release получаете конечную точку и координаты выделенного прямоугольника соответственно
-заренделить выбранную область
Примерно так (только использовать координаты прямоугольника естественно)
Код:

        QImage image = QImage(ui->graphicsView->viewport()->rect().size(), QImage::Format_ARGB32);
        QPainter p1(&image);
        ui->graphicsView_header->viewport()->render(&p1);
        image.save(fileName,fileFormat);
« Последнее редактирование: Октябрь 19, 2015, 17:05 от Nidxogg » Записан
Bepec
Гость
« Ответ #2 : Октябрь 19, 2015, 17:06 »

А можно повесить евент фильтр с тем же результатом, но это уже просто разные варианты с одинаковым результатом Улыбающийся
Записан
Nidxogg
Гость
« Ответ #3 : Октябрь 19, 2015, 17:10 »

А можно повесить евент фильтр с тем же результатом, но это уже просто разные варианты с одинаковым результатом Улыбающийся
Через евент фильтр не пробовал
Записан
Hvzh
Гость
« Ответ #4 : Октябрь 19, 2015, 17:14 »

Спасибо, завтра буду пробовать
Записан
Hvzh
Гость
« Ответ #5 : Октябрь 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) - исходное, не повернутое...
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Октябрь 19, 2015, 19:22 »

Через евент фильтр не пробовал
И не надо.
Фильтр событий это экстренный вариант решения проблемы, но не как ни штатное средство разработки.
Когда, вы делаете полноценный виджет обрабатывающий события, то вы знаете, что если этот виджет в фокусе, то все события адресуются в первую очередь ему. А при использовании фильтров событий, обработчик события можно поместить в какой-то объект, который и виджетом не будет являться и он будет обрабатывать события, а вы судорожно разбираться, почему до какого-то виджета не доходят какие-то события вообще. И чем больше у вас будет навешено фильтров, тем сложнее с этим хозяйством будет разбираться.
« Последнее редактирование: Октябрь 19, 2015, 19:51 от Old » Записан
Bepec
Гость
« Ответ #7 : Октябрь 19, 2015, 20:00 »

Old вы немного не правы.
EventFilter - это стандартный способ внести изменения в стандартную обработку, НЕ ОТКЛЮЧАЯ её и не производя фигню с наследованием ради пары функций, что ущербно.

Никто не мешает дальше посылать события виджетам как обычно, а то что вы привели это просто код программистов, которые не читали описания к eventFilter Улыбающийся Просто будет надстройка, на их основании производящая какие то действия.

PS даже сотня фильтров не изменит поведение стандартных виджетов, если не будут глотать события Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Октябрь 19, 2015, 20:10 »

EventFilter - это стандартный способ внести изменения в стандартную обработку, НЕ ОТКЛЮЧАЯ её и не производя фигню с наследованием ради пары функций, что ущербно.
Можно наследоваться и ради одной функции и это будет лучшим решением. Количество переопределяемых функций не имеет никакого значения.
И то, что это средство доступно, вовсе не означает, что его нужно пихать во все места. Это по настоящему - ущербно.

Никто не мешает дальше посылать события виджетам как обычно, а то что вы привели это просто код программистов, которые не читали описания к eventFilter Улыбающийся
Я привел то, что происходит в больших проектах, когда все кто угодно пытаются навешивать фильтры на все, что только можно. Потом, они месяцами не могут найти причины не прихода событий куда надо, а потом все дружно мы находим фильтр событий установленный куда нибудь на главное окно или объект QApplication, который по неведомым никому правилам пытался "обрабатывать" какие-то события.

PS даже сотня фильтров не изменит поведение стандартных виджетов, если не будут глотать события Улыбающийся
Ну вот ТС нужно что бы обработчик, в вашей терминологии, глотал события.
« Последнее редактирование: Октябрь 19, 2015, 20:40 от Old » Записан
Bepec
Гость
« Ответ #9 : Октябрь 19, 2015, 20:48 »

Old давайте не будем спорить - это официальный и доступный и удобный способ. Всякие "наследоваться и менять функцию" - это так же губительно при кривых руках.

Специально для вас - проект маленький, человек учится, и да - все все изменения отслеживаются при помощи Ctrl+F "eventFilter". Вместо сотен классов огромного проекта, в каждом из которых будет переопределено по 1 функции.

Не надо писать - "Это плохой способ", "это ЛУЧШЕЕ решение", "Хрен потом найдешь".
Надо писать - это один из вариантов, который ВАМ лично не нравится, ВЫ считаете его худшим и ВЫ хрен потом найдете куда события улетают Улыбающийся Ну или приводите пруфы от титанов Qt/C++.

PS а на деле мало данных от ТСса, возможно он работает с изображением как с QGraphicsItem(или одним его специализированным предком), так что вариант с View лишь наши догадки Улыбающийся
« Последнее редактирование: Октябрь 19, 2015, 20:50 от Bepec » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Октябрь 19, 2015, 20:53 »

Ну или приводите пруфы от титанов Qt/C++.
Верес, я совершенно не собираюсь вам ничего доказывать, тем более приводить пруфы от непонятных людей. Улыбающийся
Делайте как угодно.
Записан
Bepec
Гость
« Ответ #11 : Октябрь 19, 2015, 20:55 »

Просто младые умы, будут считать ваши откровения истиной в первой инстанции. Вместо того, чтобы попробовать самим Веселый
Ну да не суть Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Октябрь 19, 2015, 20:57 »

Просто младые умы, будут считать ваши откровения истиной в первой инстанции. Вместо того, чтобы попробовать самим Веселый
Ну да не суть Улыбающийся
Они будут осторожны и не будут этот механизм сувать во все места. А для небольших "корректировок" он очень удобен.
Записан
Hvzh
Гость
« Ответ #13 : Октябрь 20, 2015, 09:27 »

Видимо, придется дать более детальное описание проекта. Проект представляет собой систему самостоятельного сканирования. Пользователь сканирует, например, книгу. Скан сохраняется в виде Jpeg-файла. При этом средствами OpenCV производится обрезка фона, при необходимости разбивка на правую-левую страницы. Полученные сканы отображаются в виде thumbnail'ов в галерее. Далее, пользователь может кликнуть на одном из thumbnail'ов, после чего изображение выводится в окно редактирования. Пользователь может повернуть изображение, изменить его яркость, резкость, контраст. Все это опять же делается средствами OpenCV. А вот вывод результирующего изображения в окно редактирования делается так:

Код:
    imageLabel->setPixmap(QPixmap::fromImage(img.scaled(this->width(), this->height(), Qt::KeepAspectRatio)));

Для описанных выше преобразований изображения данный метод его вывода вполне приемлем. Однако не так давно возникла необходимость в добавлении еще двух функций редактирования: увеличение части изображения и вырезание прямоугольной части изображения с последующим ее сохранением. Вот я и ломаю голову, каким образом имплементировать эти две функции.
Записан
Bepec
Гость
« Ответ #14 : Октябрь 20, 2015, 12:45 »

Прикольно, имеется imageLabel. Интересно какого оно типа Веселый
Мб не стоит использовать QGraphicsView/Scene с такой задачей?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.062 секунд. Запросов: 23.