crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> контейнер для указателей, Q
void*
  опции профиля:
сообщение 1.8.2008, 21:06
Сообщение #1


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

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




Репутация:   3  


есть QList<QTreeWidgetItem*>, получаемый с помощью QTreeWidget::selectedItems(). Нужно брать первый элемент контейнера(в нем больше быть и не может) и для работы с ним преобразовать этот элемент в мой тип(TreeItem*, класс унаследованный от QTreeWidgetItem). Вот проблемный участок кода:
QTreeWidgetItem *i = tree->selectedItems().first(); //tree - QTreeWidget
TreeItem *item = qobject_cast<TreeItem*>(i);

но компилятор ругается:
ошибка: нет соответствующей функции для вызова ‘qobject_cast(QTreeWidgetItem*&)’

как с этим бороться? или может для указателей нужно использовать какие-то другие контейнеры, специализированные?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.8.2008, 21:17
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(void* @ 2.8.2008, 1:06) *
ожет для указателей нужно использовать какие-то другие контейнеры

дак QList<QTreeWidgetItem*> уже из названия видно что это список указателей

да и ругается он на вторую строчку
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 1.8.2008, 21:17
Сообщение #3


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

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




Репутация:   3  


Цитата(Litkevich Yuriy @ 1.8.2008, 21:13) *
дак QList<QTreeWidgetItem*> уже из названия видно что это список указателей

это я понимаю, ну а как тогда решить мою проблему?

кстати изначально было так:
TreeItem *item = qobject_cast<TreeItem*>(tree->selectedItems().first());

и та же самая ошибка, поэтому ошибка мне кажется где-то здесь - tree->selectedItems().first()

Сообщение отредактировал void* - 1.8.2008, 21:20
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.8.2008, 21:26
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


вот на это место внимание обрати:
Цитата(void* @ 2.8.2008, 1:06) *
QTreeWidgetItem*&


метод .first() возвращает ссылку, а не указатель
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 1.8.2008, 21:27
Сообщение #5


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

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




Репутация:   3  


я-то понимаю, но как с этим можно бороться?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.8.2008, 21:33
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


может я конечно под вечер гоню, но помоему так:
TreeItem *item = qobject_cast<TreeItem*>(&i);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 1.8.2008, 21:36
Сообщение #7


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

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




Репутация:   3  


не. тогда получается
ошибка: нет соответствующей функции для вызова ‘qobject_cast(QTreeWidgetItem**)’

чет я конкретно запутался с этими указателями...

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

Сообщение отредактировал void* - 1.8.2008, 21:38
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.8.2008, 22:00
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


а почему бы просто не сделать:
TreeItem *item = tree->currentItem();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 2.8.2008, 8:54
Сообщение #9


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

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

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




Репутация:   17  


Цитата(void* @ 2.8.2008, 1:06) *
QTreeWidgetItem *i = tree->selectedItems().first(); //tree - QTreeWidget
TreeItem *item = qobject_cast<TreeItem*>(i);

но компилятор ругается:
ошибка: нет соответствующей функции для вызова ‘qobject_cast(QTreeWidgetItem*&)’

как с этим бороться?

Контейнер здесь не причём. Это ошибка из qobject_cast.
Для его правильной работы нужна некоторая метоинформация, которой для твоего класса TreeItem он не имет.
Чтобы исправить, нужно в объявление TreeItem поместить макрос Q_OBJECT.

Есть второй путь - использовать стандартный dynamic_cast и не мучатся. :)

P.S. qobject_cast быс сделан чтобы заменить dynamic_cast который криво работает на некоторых старых компиляторах С++ которые приходится поддерживать тролям. На современных компиляторах смысла в нём нет. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Red Devil
  опции профиля:
сообщение 2.8.2008, 11:09
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 68
Регистрация: 6.6.2008
Из: Saint-Petersburg
Пользователь №: 194

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




Репутация:   3  


Цитата(Tonal @ 2.8.2008, 9:54) *
P.S. qobject_cast быс сделан чтобы заменить dynamic_cast который криво работает на некоторых старых компиляторах С++ которые приходится поддерживать тролям. На современных компиляторах смысла в нём нет.

гы-гы.
Я могу сказать, что тролли с версии 4.4.0, не то что старые, но и не очень старые компиляторы не поддерживают.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 23.11.2024, 0:42