![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
Darvin |
![]()
Сообщение
#1
|
Студент ![]() Группа: Новичок Сообщений: 36 Регистрация: 30.11.2007 Пользователь №: 30 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Подскажите правильный общий метод решения следующей задачи.
Наследую class MyPixmap: public QPixmap //в котором добавлено дополнительное описание объекта Pixmap { ... public: //пусть пока так MyType X; //некоторое описание ... } MyPixmap::MyPixmap(const QString& filename, MyType _x):QPixmap(filename) { X=_x; } Загружаю картинку, делаю приведение типов и добавляю картинку в сцену используя стандартные функции QT. QGraphicsPixmapItem *item = scene->addPixmap((QPixmap)MyPixmap("my_file.jpg",x_value)); В сцену добавляется QPixmap, но сцена ничего не знает о новых членах(X) класса MyPixmap. Замечу, что я сознательно не стал заводить внешнюю переменную MyPixmap или расширять класс сцены, в котором для каждого QGraphicsPixmapItem, должен быть сопоставлен MyPixmap с описанием. При этом придется написать много лишнего кода, для обслуживания данного соотвествия. Хочу в любом месте программы получить доступ к членам класса MyPixmap, выполнив простое приведение типов ((MyPixmap *)(&(item->pixmap())))->X Никак не получается. Наверное это неправильно? Как сделать лучше? |
|
|
![]() |
Admin |
![]()
Сообщение
#2
|
Администратор ![]() ![]() ![]() ![]() Группа: Администратор Сообщений: 646 Регистрация: 9.10.2007 Из: crossplatform.ru Пользователь №: 1 Спасибо сказали: 17 раз(а) Репутация: ![]() ![]() ![]() |
Не совсем понятно, почему ((MyPixmap *)(&(item->pixmap())))->X не работает...
|
|
|
Swappp |
![]()
Сообщение
#3
|
Студент ![]() Группа: Новичок Сообщений: 20 Регистрация: 26.11.2007 Пользователь №: 25 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
QGraphicsPixmapItem *item = scene->addPixmap((QPixmap)MyPixmap("my_file.jpg",x_value));
Давай разберем, что обозначает эта строчка? MyPixmap("my_file.jpg",x_value) создать экземпляр класса. (QPixmap)MyPixmap("my_file.jpg",x_value) а тут происходит приведение типа, а не указателя, т.е. создается фактически копия, но ее тип уже QPixmap... Естественно до методов MyPixmap не добраться. В общем, ИМХО тут ничего не получится. Нужно создавать свою реализацию QGraphicsPixmapItem, тем более это достаточно просто. |
|
|
ViGOur |
![]()
Сообщение
#4
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Ничего удивительного, ты вот здесь:
Передаешь ссылку на временную переменную, которая после отработки данной строчки перестает существовать.
|
|
|
Swappp |
![]()
Сообщение
#5
|
Студент ![]() Группа: Новичок Сообщений: 20 Регистрация: 26.11.2007 Пользователь №: 25 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Цитата Не совсем понятно, почему ((MyPixmap *)(&(item->pixmap())))->X не работает... потому что item->pixmap() уже никак не указатель на MyPixmap. Если бы scene->addPixmap() принимала аргументом указатель на QPixmap, то все работало бы. А она принимает const QPixmap & pixmap. |
|
|
ViGOur |
![]()
Сообщение
#6
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
(QPixmap)MyPixmap("my_file.jpg",x_value) а тут происходит приведение типа, а не указателя, т.е. создается фактически копия, но ее тип уже QPixmap... Естественно до методов MyPixmap не добраться. Не успел ![]() В общем, ИМХО тут ничего не получится. Нужно создавать свою реализацию QGraphicsPixmapItem, тем более это достаточно просто. Согласен.
|
|
|
Darvin |
![]()
Сообщение
#7
|
Студент ![]() Группа: Новичок Сообщений: 36 Регистрация: 30.11.2007 Пользователь №: 30 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
QGraphicsPixmapItem *item = scene->addPixmap((QPixmap)MyPixmap("my_file.jpg",x_value)); Давай разберем, что обозначает эта строчка? MyPixmap("my_file.jpg",x_value) создать экземпляр класса. (QPixmap)MyPixmap("my_file.jpg",x_value) а тут происходит приведение типа, а не указателя, т.е. создается фактически копия, но ее тип уже QPixmap... Естественно до методов MyPixmap не добраться. Т.е. получается, что как только я создаю новый класс MyPixmap я должен создать новый класс MyScene, чтобы с ним работать, а также создать новые классы от всех классов колторые мне могут понадобиться? И это всё из-за того, что вместо приведения типов указателей выполняется копирование экземпляров? Сложность стремительно нарастает... В общем, ИМХО тут ничего не получится. Нужно создавать свою реализацию QGraphicsPixmapItem, тем более это достаточно просто. Допустим я создам такой класс MyPixmapItem, и как его добавить в сцену, которая об этом классе ничего не знает? |
|
|
Swappp |
![]()
Сообщение
#8
|
Студент ![]() Группа: Новичок Сообщений: 20 Регистрация: 26.11.2007 Пользователь №: 25 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Цитата Т.е. получается, что как только я создаю новый класс MyPixmap я должен создать новый класс MyScene, чтобы с ним работать, а также создать новые классы от всех классов колторые мне могут понадобиться? И это всё из-за того, что вместо приведения типов указателей выполняется копирование экземпляров? Сложность стремительно нарастает... Конечно нет. Есть такое понятие как полиморфизм ![]() Цитата void QGraphicsPixmapItem::setPixmap(const QPixmap &pixmap) { Q_D(QGraphicsPixmapItem); prepareGeometryChange(); d->pixmap = pixmap; d->updateShape(); update(); } Но QGraphicsScene создавалась с учетом того, что бы разработчик мог создавать свои классы элементов. По тому есть такой класс как QGraphicsItem, у которого есть виртульные методы. А сам QGraphicsScene имеет метод void QGraphicsScene::addItem ( QGraphicsItem * item ), который как видишь принимает указатель. Советую почитать по поводу полиморфизма книжки, например Страуструпа, но внимательно ![]() Сообщение отредактировал Swappp - 30.11.2007, 19:54 |
|
|
Darvin |
![]()
Сообщение
#9
|
Студент ![]() Группа: Новичок Сообщений: 36 Регистрация: 30.11.2007 Пользователь №: 30 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Но QGraphicsScene создавалась с учетом того, что бы разработчик мог создавать свои классы элементов. По тому есть такой класс как QGraphicsItem, у которого есть виртульные методы. А сам QGraphicsScene имеет метод void QGraphicsScene::addItem ( QGraphicsItem * item ), который как видишь принимает указатель. Советую почитать по поводу полиморфизма книжки, например Страуструпа, но внимательно ![]() OK! Попробую с этого боку. Спасибо за оперативность! |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 22.6.2025, 19:27 |