Доступ к private ... pixmap из другого класса?, Или как реализовать по другому |
Здравствуйте, гость ( Вход | Регистрация )
Доступ к private ... pixmap из другого класса?, Или как реализовать по другому |
Darvin |
30.11.2007, 19:12
Сообщение
#1
|
Студент Группа: Новичок Сообщений: 36 Регистрация: 30.11.2007 Пользователь №: 30 Спасибо сказали: 0 раз(а) Репутация: 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 |
30.11.2007, 19:33
Сообщение
#2
|
Администратор Группа: Администратор Сообщений: 646 Регистрация: 9.10.2007 Из: crossplatform.ru Пользователь №: 1 Спасибо сказали: 17 раз(а) Репутация: 2 |
Не совсем понятно, почему ((MyPixmap *)(&(item->pixmap())))->X не работает...
|
|
|
Swappp |
30.11.2007, 19:36
Сообщение
#3
|
Студент Группа: Новичок Сообщений: 20 Регистрация: 26.11.2007 Пользователь №: 25 Спасибо сказали: 1 раз(а) Репутация: 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 |
30.11.2007, 19:39
Сообщение
#4
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Ничего удивительного, ты вот здесь:
Передаешь ссылку на временную переменную, которая после отработки данной строчки перестает существовать.
|
|
|
Swappp |
30.11.2007, 19:41
Сообщение
#5
|
Студент Группа: Новичок Сообщений: 20 Регистрация: 26.11.2007 Пользователь №: 25 Спасибо сказали: 1 раз(а) Репутация: 1 |
Цитата Не совсем понятно, почему ((MyPixmap *)(&(item->pixmap())))->X не работает... потому что item->pixmap() уже никак не указатель на MyPixmap. Если бы scene->addPixmap() принимала аргументом указатель на QPixmap, то все работало бы. А она принимает const QPixmap & pixmap. |
|
|
ViGOur |
30.11.2007, 19:41
Сообщение
#6
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
(QPixmap)MyPixmap("my_file.jpg",x_value) а тут происходит приведение типа, а не указателя, т.е. создается фактически копия, но ее тип уже QPixmap... Естественно до методов MyPixmap не добраться. Не успел В общем, ИМХО тут ничего не получится. Нужно создавать свою реализацию QGraphicsPixmapItem, тем более это достаточно просто. Согласен.
|
|
|
Darvin |
30.11.2007, 19:47
Сообщение
#7
|
Студент Группа: Новичок Сообщений: 36 Регистрация: 30.11.2007 Пользователь №: 30 Спасибо сказали: 0 раз(а) Репутация: 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 |
30.11.2007, 19:51
Сообщение
#8
|
Студент Группа: Новичок Сообщений: 20 Регистрация: 26.11.2007 Пользователь №: 25 Спасибо сказали: 1 раз(а) Репутация: 1 |
Цитата Т.е. получается, что как только я создаю новый класс MyPixmap я должен создать новый класс MyScene, чтобы с ним работать, а также создать новые классы от всех классов колторые мне могут понадобиться? И это всё из-за того, что вместо приведения типов указателей выполняется копирование экземпляров? Сложность стремительно нарастает... Конечно нет. Есть такое понятие как полиморфизм Суть в том, что разработчики Qt посчитали, что QGraphicsPixmapItem можно использовать исключительно с QPixmap. И там кстати еще и внутри происходит копирование: Цитата 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 |
30.11.2007, 19:56
Сообщение
#9
|
Студент Группа: Новичок Сообщений: 36 Регистрация: 30.11.2007 Пользователь №: 30 Спасибо сказали: 0 раз(а) Репутация: 0 |
Но QGraphicsScene создавалась с учетом того, что бы разработчик мог создавать свои классы элементов. По тому есть такой класс как QGraphicsItem, у которого есть виртульные методы. А сам QGraphicsScene имеет метод void QGraphicsScene::addItem ( QGraphicsItem * item ), который как видишь принимает указатель. Советую почитать по поводу полиморфизма книжки, например Страуструпа, но внимательно OK! Попробую с этого боку. Спасибо за оперативность! |
|
|
Текстовая версия | Сейчас: 25.4.2024, 18:20 |