Russian Qt Forum

Qt => Вопросы новичков => Тема начата: demaker от Апрель 08, 2014, 11:41



Название: QAbstractItemModel
Отправлено: demaker от Апрель 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);
}
 


Название: Re: QAbstractItemModel
Отправлено: Bepec от Апрель 08, 2014, 11:48
Вы напрямую преобразуете неизвестное в  QObject *childObj и даже не проверяете результата :)

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


Название: Re: QAbstractItemModel
Отправлено: demaker от Апрель 08, 2014, 11:56

void * QModelIndex::internalPointer ()  не настораживает? :D Воид он возвращает, а не QObject.
ну у меня вообще-то
Код:
reinterpret_cast


Название: Re: QAbstractItemModel
Отправлено: Bepec от Апрель 08, 2014, 12:23
Т.е. если я сделаю
QPixmap pixmap = reinterpret_cast<QPixmap*>("1");
то получу картинку единицы? :)

Вы берёте указатель неизвестно на что и приводите к QObject. И надеетесь что там будут все методы QObject? :)


Название: Re: QAbstractItemModel
Отправлено: Igors от Апрель 08, 2014, 12:35
Т.е. если я сделаю
QPixmap pixmap = reinterpret_cast<QPixmap*>("1");
А Вы можете так сделать? :) И следите за словами (не void а указатель на void).

demaker, reinterpret_cast просто затыкает рот компилятору но ничего не преобразовывает. Если значение указателя было нулевым/невалидным, то таким же и осталось. internalPointer не установлен правильно. И вообще как-то грустно от таких вопросов  :'(


Название: Re: QAbstractItemModel
Отправлено: Bepec от Апрель 08, 2014, 12:59
Могу :D reinterpret преобразует всё во всё, не делая никаких проверок :D


Название: Re: QAbstractItemModel
Отправлено: Igors от Апрель 08, 2014, 13:03
Могу :D reinterpret преобразует всё во всё, не делая никаких проверок :D
Да неужели? Тогда прошу откомпилить что Вы написали

QPixmap pixmap = reinterpret_cast<QPixmap*>("1");


Название: Re: QAbstractItemModel
Отправлено: kambala от Апрель 08, 2014, 14:18
Верес, звездочка или лишняя или ее не хватает ;)


Название: Re: QAbstractItemModel
Отправлено: Bepec от Апрель 08, 2014, 14:20
Упсь ну эт да )

Указатель к указателю приводить можно :) А обратно нельзя :) Но это простительно) Звёздочка после QPixmap нужна :D


Название: Re: QAbstractItemModel
Отправлено: Igors от Апрель 08, 2014, 14:41
Упсь ну эт да )

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

Да. и "обратно" тоже можно  :)


Название: Re: QAbstractItemModel
Отправлено: Bepec от Апрель 08, 2014, 15:12
Со звёздочкой компилит.

Ну зачем надо себя подставлять, дальше бла бла бла, подставьте сами :)



Название: Re: QAbstractItemModel
Отправлено: Igors от Апрель 08, 2014, 16:27
Со звёздочкой компилит.
Так это баг MSVC. В любом приличном компиляторе должны получить типа
Цитировать
reinterpret_cast from 'const char *' to 'QPixmap *' casts away qualifiers
Включая и Qt Creator

Ну зачем надо себя подставлять, дальше бла бла бла, подставьте сами :)
Не надо огрызаться и хвостик подымать - так недостатки только заметнее  :)


Название: Re: QAbstractItemModel
Отправлено: Old от Апрель 08, 2014, 16:34
Включая и Qt Creator
К сожалению Qt Creator не умеет компилировать код. :)


Название: Re: QAbstractItemModel
Отправлено: Bepec от Апрель 08, 2014, 17:00
Быгыгы :D Самый строгий компилятор это MSVC. Остальные имеют расхождения со стандартом (не имею в виду новый :) )

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

PS бла бла бла о том, как так можно? :)


Название: Re: QAbstractItemModel
Отправлено: Old от Апрель 08, 2014, 17:03
Самый строгий компилятор это MSVC.
Смешно.  ;D
Это самый не слушающий стандарт компилятор с кучей своих расширений, которых больше нет нигде.


Название: Re: QAbstractItemModel
Отправлено: Bepec от Апрель 08, 2014, 17:43
Ну я видел только вот что:
Код, компилировавшийся под MSVC, прекрасно компилируется под mingw.
Код, компилировавшийся под mingw прекрасно НЕ компилируется под MSVC.

И всякий ужас типа массивов неопределённой на этапе компиляции длины в стандарте не описан. Специально на этот счет искал, узнавал, выносил мозг другим людям.

PS ужас выражен тем, что я переделывал штук 5 программ с него на MSVC. И это мля ха муха  адский труд, ибо надо переписывать всё :)

PPS приведите пожалуйста кучу расширений :) Хоть увижу одним глазком.


Название: Re: QAbstractItemModel
Отправлено: Old от Апрель 08, 2014, 17:45
Знаю человека, который переделывал все с msvc на gcc. При нем до сих пор не рекомендуется произносить ms, может в лицо вцепиться. :)
А там спокойнейший человек: борода, очки.  ;D


Название: Re: QAbstractItemModel
Отправлено: Old от Апрель 08, 2014, 17:46
PPS приведите пожалуйста кучу расширений :) Хоть увижу одним глазком.
Так гугл же. :)
Набирайте "нестандартные расширения msvc".


Название: Re: QAbstractItemModel
Отправлено: Alex Custov от Апрель 08, 2014, 17:54
ну, ради справедливости, расширения есть у многих компиляторов, и у gcc тоже. И они по-умолчанию включены, что провоцирует писать нестандартный код.


Название: Re: QAbstractItemModel
Отправлено: Old от Апрель 08, 2014, 17:56
ну, ради справедливости, расширения есть у многих компиляторов, и у gcc тоже. И они по-умолчанию включены, что провоцирует писать нестандартный код.
Я не спорю, что они есть везде, меня улыбнуло это:
Самый строгий компилятор это MSVC.


Название: Re: QAbstractItemModel
Отправлено: Alex Custov от Апрель 08, 2014, 18:01
PS ужас выражен тем, что я переделывал штук 5 программ с него на MSVC. И это мля ха муха  адский труд, ибо надо переписывать всё :)

Всё не так сложно, компилируешь сперва самим gcc поновее, с -pedantic и со всеми warnings. Исправляешь ошибки.

P.S. Правда это не компилятор виноват в этих ошибках, а криворукий программист.


Название: Re: QAbstractItemModel
Отправлено: Igors от Апрель 08, 2014, 18:17
Эдак мы отклонились от темы

Могу :D reinterpret преобразует всё во всё, не делая никаких проверок :D
Это неверно даже для указателей, вот пример который не откомпилится и на великом MSVC
Код
C++ (Qt)
const char * txt = "1";
QPixmap * pm = reinterpret_cast <QPixmap *> (txt);
 

Быгыгы :D
...
PS бла бла бла
Зачем вставлять эти междометия в каждый пост? "Учащийся ПТУ" что ли? (хз как оно сейчас называется). Зачем браться отвечать начинающему, да еще и изображать иронию, если плаваете в простых вещах? Может лучше "молчать и слушать"?  :)


Название: Re: QAbstractItemModel
Отправлено: Old от Апрель 08, 2014, 18:19
Зачем браться отвечать начинающему, да еще и изображать иронию, если плаваете в простых вещах? Может лучше "молчать и слушать"?  :)

Скажите, у вас принтер под рукой?


Название: Re: QAbstractItemModel
Отправлено: Bepec от Апрель 08, 2014, 18:56
Пфф... "Я привёл пример, я его доказал, я велик" © я.

Все ограничения reinterpret_cast можно почитать по этой ссылке http://msdn.microsoft.com/ru-ru/library/e0w9f63b.aspx.

PS более по вашим вопросам тут отвечать не буду, а то опять флуд :/


Название: Re: QAbstractItemModel
Отправлено: Igors от Апрель 09, 2014, 08:33
Все ограничения reinterpret_cast можно почитать по этой ссылке http://msdn.microsoft.com/ru-ru/library/e0w9f63b.aspx.
Это надо было читать сразу как только Вам мягко намекнули какую хирню Вы написали.

PS более по вашим вопросам тут отвечать не буду, а то опять флуд :/
Очень хорошо, но еще лучше Вам вообще нигде не отвечать.