Russian Qt Forum
Ноябрь 24, 2024, 03:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QAbstractItemModel  (Прочитано 9611 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« : Апрель 08, 2014, 11:41 »

Подскажите пожалуйста почему вылетает

Код
C++ (Qt)
QModelIndex TreeModelBrowser::parent(const QModelIndex &child) const
{
   if(!child.isValid())
       return QModelIndex();
 
   QObject *childObj = reinterpret_cast<QObject*>(child.internalPointer());
   QObject *parentObj = childObj->parent();// Вылетает вот здесь ???
 
   if(parentObj == base)
       return QModelIndex();
 
   int row = parentObj->parent()->children().indexOf(parentObj);
   return createIndex(row,0,parentObj);
}
 
Записан
Bepec
Гость
« Ответ #1 : Апрель 08, 2014, 11:48 »

Вы напрямую преобразуете неизвестное в  QObject *childObj и даже не проверяете результата Улыбающийся

void * QModelIndex::internalPointer ()  не настораживает? Веселый Воид он возвращает, а не QObject.
А вам видимо нужно QModelIndex QAbstractItemModel::createIndex ( int row, int column, void * ptr = 0 ). И это воид воткнуть в третий параметр. Хотя не понимаю зачем такие сложности Улыбающийся
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #2 : Апрель 08, 2014, 11:56 »


void * QModelIndex::internalPointer ()  не настораживает? Веселый Воид он возвращает, а не QObject.
ну у меня вообще-то
Код:
reinterpret_cast
Записан
Bepec
Гость
« Ответ #3 : Апрель 08, 2014, 12:23 »

Т.е. если я сделаю
QPixmap pixmap = reinterpret_cast<QPixmap*>("1");
то получу картинку единицы? Улыбающийся

Вы берёте указатель неизвестно на что и приводите к QObject. И надеетесь что там будут все методы QObject? Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Апрель 08, 2014, 12:35 »

Т.е. если я сделаю
QPixmap pixmap = reinterpret_cast<QPixmap*>("1");
А Вы можете так сделать? Улыбающийся И следите за словами (не void а указатель на void).

demaker, reinterpret_cast просто затыкает рот компилятору но ничего не преобразовывает. Если значение указателя было нулевым/невалидным, то таким же и осталось. internalPointer не установлен правильно. И вообще как-то грустно от таких вопросов  Плачущий
Записан
Bepec
Гость
« Ответ #5 : Апрель 08, 2014, 12:59 »

Могу Веселый reinterpret преобразует всё во всё, не делая никаких проверок Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Апрель 08, 2014, 13:03 »

Могу Веселый reinterpret преобразует всё во всё, не делая никаких проверок Веселый
Да неужели? Тогда прошу откомпилить что Вы написали

QPixmap pixmap = reinterpret_cast<QPixmap*>("1");
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Апрель 08, 2014, 14:18 »

Верес, звездочка или лишняя или ее не хватает Подмигивающий
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #8 : Апрель 08, 2014, 14:20 »

Упсь ну эт да )

Указатель к указателю приводить можно Улыбающийся А обратно нельзя Улыбающийся Но это простительно) Звёздочка после QPixmap нужна Веселый
« Последнее редактирование: Апрель 08, 2014, 14:34 от Bepec » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Апрель 08, 2014, 14:41 »

Упсь ну эт да )

Указатель к указателю приводить можно Улыбающийся А обратно нельзя Улыбающийся Но это простительно) Звёздочка после QPixmap нужна Веселый
Ну зачем надо себя подставлять, разве так трудно вставить строку в проект и нажать Cmd-K (Ctl F7)?  Улыбающийся  Ведь все равно и со звездочкой не откомпилит. Не такой уж он простой, этот reinterpret_cast

Да. и "обратно" тоже можно  Улыбающийся
Записан
Bepec
Гость
« Ответ #10 : Апрель 08, 2014, 15:12 »

Со звёздочкой компилит.

Ну зачем надо себя подставлять, дальше бла бла бла, подставьте сами Улыбающийся

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Апрель 08, 2014, 16:27 »

Со звёздочкой компилит.
Так это баг MSVC. В любом приличном компиляторе должны получить типа
Цитировать
reinterpret_cast from 'const char *' to 'QPixmap *' casts away qualifiers
Включая и Qt Creator

Ну зачем надо себя подставлять, дальше бла бла бла, подставьте сами Улыбающийся
Не надо огрызаться и хвостик подымать - так недостатки только заметнее  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Апрель 08, 2014, 16:34 »

Включая и Qt Creator
К сожалению Qt Creator не умеет компилировать код. Улыбающийся
Записан
Bepec
Гость
« Ответ #13 : Апрель 08, 2014, 17:00 »

Быгыгы Веселый Самый строгий компилятор это MSVC. Остальные имеют расхождения со стандартом (не имею в виду новый Улыбающийся )

А тонкости надо знать ) В данном случае у меня указатель на 1 символ строки преобразуется в указатель на QPixmap Улыбающийся

PS бла бла бла о том, как так можно? Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #14 : Апрель 08, 2014, 17:03 »

Самый строгий компилятор это MSVC.
Смешно.  Смеющийся
Это самый не слушающий стандарт компилятор с кучей своих расширений, которых больше нет нигде.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.194 секунд. Запросов: 22.