Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QGraphicsPixmapItem c "фенечками"
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Система рисования. Печать
Elfinit
Есть QGraphicsScene, на которой куча ThumbnailItem'ов - наследников QGraphicsPixmapItem.
Под каждым из которых может выводиться список "интерактивных элементов". Как пример - пиктограмм фотобанков, на которые была отправлена фотка.
Отрисовывать их как обычные QPixmap в ThumbnailItem::paint не составляет труда, НО - они должны быть "интерактивными". Т.е., как минимум, должны реагировать на наведение на них курсора, показывая некий тултип. А в идеале - реагировать на нажатие, запрос контекстного меню и т.п.
Эти "фенечки" должны быть жёстко привязаны к своему ThumbnailItem, так что вариант делать их самих QGraphicsItem - ооочень сложно реализуем. Т.к. координаты их зависят от своего THumbnailItem, "информационная нагрузка" - тоже. К тому же, сцена иногда меняет режим отображения и все ThumbnailItem'ы нужно скрыть, так что "фенечки" должны изчезать вместе с ними. Другой пример сложности реализации их как независимого QGraphicsItem - ресайз сцены или резайз самих эскизов. См. скриншот, там внизу сцены ползунок, которым можно регулировать размер эскизов.
Так что нужна жёсткая привязка этих штучек к ThumbnailItem.
Есть какие-нить соображения?)
ufna
опять таки, варианта два:

1. Классический, не побоюсь этого слова. Так делалось все гуи в компьютерных игрушкас с давних пор и до сих пор, пока не придумали гуи для опенГЛ и директХ "для ленивых". Да и сейчас так же, только в более серьезное степени все это сделано, но основа - та же самая.

Рисуем вручную, пеинтером. При отрисовке - заполняем массив QRect - области, где висят у тебя айтемы.
Айтемы представляют из себя структуру/класс/да как хочешь, которая рисуется в зависимости от некоторых условий (можно делать и не классом, но так удобнее). У каждого айтема - три стейта: обычное состояние, нажатое состояние, состояние "в фокусе".
В мувЭвенте класса вот этого главного проходим по списку прямоугольников, смотрим "на какой попали" - меняем стейт.
То же самое в пресс эвенте и релиз - в одном - делаем стейт "нажато", в другом - "нормально".

С тултипом - аналогичные вещи (пусть текст тултипа - хранится в классе). Меню - то же самое.

Перемещение, ресайз, поворот - все это легко реализуется этими вещами. Я сейчас на этой основе проект по печати фото делаю, могу показать как это работает и код главного "рисовальщика".

Главное не забывать про двойную буферизацию и время для "update(<нужный рект>)".


2. Вариант через GVC. Реализуется все точно таким же образом. Делаешь наследника класса график айтем, у него переопределяешь нужные эвенты, никаких проблем я вообще не вижу.

Масштаб вообще проблем не представляет, ресайз - тоже. Ловишь нужные эвенте, перестраиваешь "на лету" положения и размер сиих кусочков, и все. Все эти как ты сказал "штучки" - рисоваться будут от системы координат айтема, а его пеинт эвенте, если сделаешь правильно.

То же самое - могу привести пример из собственного опыта работы с GVC.
Elfinit
По первому варианту - я и так уже отлавливаю события наведения, нажатия и т.п. для ThumbnailItem и в зависимости от стэйтов меняю, например, вид тени и цвет прямоугольника вокруг картинки. НО. ThumbnailItem - это только сама картинка, всё, что "рядом" с ней - а это те же "фенечки" и фоновый подсвеченный прямоугольник - "географически" к нему не относятся. Т.е. при наведении на пиктограммку стэйт самого ThumbnailItem по-прежнему останется стандартным (ну или isSelected, если до этого он был выделен). Т.е. если идти по пути проверки нахождения курсора в прямоугольнике - нужно анализировать его координаты и координаты пиктограммы относительно сцены. А это не вариант.
Попутно вопрос - можно ли для QGraphicsPixmapItem аставить генерироваться hoverEvent'ы, если курсор проползает не только над самим айтемом, но в некоторой области около него?
ufna
Вопрос - а почему их нельзя отнести к нему географически? Что мешает? Можно еще сделать один класс, который будет содержать в себе ThumbnailItem, а так же - эти пиктограммки. Допустим будет это LayoutThumbRect. Тогда в мув эвенте ищем куда попал курсор, на который из этих ректов, затем в этот класс отправляем сии координаты, а он уже смотрит на картинке ли курсор, или же на пиктограммах. Можно еще пути смотреть.

к тому же почему анализ положения курсора в прямоугольниках - не вариант? Вполне даже вариант, для этого есть очень удобный QRect::contains(QPoint). А если их прям такое дикое количество (сотни и т.п.) - можно воспользоваться школьными знаниями и оптимизировать алгоритм поиска, а не просто по циклу все прогонять.

можно так же каждой пиктограммке жестко привязывать "родительский тамб", т.е. давать ей указатель на тот объект, к которому она относится. Предоставить ей доступ к управлению тамбом, его стейтом, к примеру, и знать его положение, и от его положения - узнавать свое.

Либо я чего-то не понимаю в чем тут идея или что.

Насчет QGraphicsPixmapItem и ховер эвентов - если переопределишь эвенты класса правильно, то можно сделать иллюзию сего. Если конечно сий эвент основывается на boundingRect (я точно не знаю).
Elfinit
Спасибо)
Пока всё же оставил как уже сделал (статичные пиктограммки под миникопией), время появиться - буду по-умному делать)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.