Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как получить доступ к QPixmap'ам на QGraphicsScene?
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Система рисования. Печать
Eff
Стокнулся с проблемой, поиск ничем не помог.

В общем, есть класс: сцена ClickedGraphicsScene - потомок QGraphicsScene. В нём переопределено событие mousePressEvent.
Сама сцена содержит несколько Pixmap'ов, добавляемых при помощи функции addPixmap. Вот сам код:

QApplication a(argc, argv);
MainWindow w;
w.show();

ClickedGraphicsScene scene;
scene.addPixmap(QPixmap("D:/123.bmp"));
scene.addPixmap( /* ещё */ );
...

QGraphicView view(&scene, w.centralWidget());
view.setGeometry(0, 0, scene.width(), scene.height());
view.show();

return a.exec();

Всё отображается нормально, все Pixmap'ы видны.
Теперь мне нужно обращаться к ним по клику на сцене мышкой. А вот что происходит при клике:

QPixmap* pixmap = (QPixmap*) itemAt(event->scenePos());

... и, увы, такой каст не проходит, в дебаге программа вешается. Я пытался искать какие-то специальные способы преобразовать QGraphicsItem в QPixmap - но ничего не нашёл...
Может, кто подскажет? Или вообще нужно не itemAt пользоваться - а есть что-то, что сразу указатель на QPixmap возвращает?

P. S. Также буду признателен, если мне кто-то подскажет более лучший способ обратиться к конкретному пикселю Pixmap'а, чем преобразование его toImage() и там уже вызов pixel(). Хотя это и не принципиально...
PAFOS
В методе scene.addPixmap( /* ещё */ ); создается объект QGraphicsPixmapItem а не QPixmap.
поэтому кастовать надо не QPixmap* pixmap = (QPixmap*) itemAt(event->scenePos()); а
QGraphicsPixmapItem * pixmapItem = (QGraphicsPixmapItem *) itemAt(event->scenePos()); и уже у pixmapItem брать pixmap.

По поводу конкретного пикселя могу посоветовать лишь создавать кэш.
Ассоциативный контейнер, где ключ есть QPixmap::cacheKey(), а значение - QImage.
Примерно так:

QHash<qint64,QImage> imagesCache;
...
...
...
// Добавление
QPixmap pixmap("D:/123.bmp");
imagesCache[pixmap.cacheKey()] = pixmap.toImage();

...
...
// Получение
QGraphicsPixmapItem * pixmapItem = (QGraphicsPixmapItem *) itemAt(event->scenePos());
QImage &img = imagesCache[ pixmapItem->pixmap().cacheKey() ];


Ну и не забывай, что при изменении QPixmap его cacheKey меняется)


Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.