crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QGraphicsPixmapItem c "фенечками"
Elfinit
  опции профиля:
сообщение 25.7.2009, 16:29
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 17.3.2009
Из: Казань
Пользователь №: 619

Спасибо сказали: 7 раз(а)




Репутация:   1  


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


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

Спасибо сказали: 29 раз(а)




Репутация:   5  


опять таки, варианта два:

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

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

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

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

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


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

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

То же самое - могу привести пример из собственного опыта работы с GVC.

Сообщение отредактировал ufna - 25.7.2009, 17:13
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 25.7.2009, 20:03
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 17.3.2009
Из: Казань
Пользователь №: 619

Спасибо сказали: 7 раз(а)




Репутация:   1  


По первому варианту - я и так уже отлавливаю события наведения, нажатия и т.п. для ThumbnailItem и в зависимости от стэйтов меняю, например, вид тени и цвет прямоугольника вокруг картинки. НО. ThumbnailItem - это только сама картинка, всё, что "рядом" с ней - а это те же "фенечки" и фоновый подсвеченный прямоугольник - "географически" к нему не относятся. Т.е. при наведении на пиктограммку стэйт самого ThumbnailItem по-прежнему останется стандартным (ну или isSelected, если до этого он был выделен). Т.е. если идти по пути проверки нахождения курсора в прямоугольнике - нужно анализировать его координаты и координаты пиктограммы относительно сцены. А это не вариант.
Попутно вопрос - можно ли для QGraphicsPixmapItem аставить генерироваться hoverEvent'ы, если курсор проползает не только над самим айтемом, но в некоторой области около него?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 25.7.2009, 20:48
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

Спасибо сказали: 29 раз(а)




Репутация:   5  


Вопрос - а почему их нельзя отнести к нему географически? Что мешает? Можно еще сделать один класс, который будет содержать в себе ThumbnailItem, а так же - эти пиктограммки. Допустим будет это LayoutThumbRect. Тогда в мув эвенте ищем куда попал курсор, на который из этих ректов, затем в этот класс отправляем сии координаты, а он уже смотрит на картинке ли курсор, или же на пиктограммах. Можно еще пути смотреть.

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

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

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

Насчет QGraphicsPixmapItem и ховер эвентов - если переопределишь эвенты класса правильно, то можно сделать иллюзию сего. Если конечно сий эвент основывается на boundingRect (я точно не знаю).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 3.8.2009, 12:45
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 17.3.2009
Из: Казань
Пользователь №: 619

Спасибо сказали: 7 раз(а)




Репутация:   1  


Спасибо)
Пока всё же оставил как уже сделал (статичные пиктограммки под миникопией), время появиться - буду по-умному делать)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 15.9.2019, 15:41