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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: добавление GraphicsItem на сцену  (Прочитано 11495 раз)
finka
Гость
« : Сентябрь 26, 2007, 16:30 »

Допустим, код примерно такой:
Код:
QGraphicsScene * scene = new QGraphicsScene;
GraphicsItem * item;
for (int i = 0; i < MAX; i++)
{
    item = new GraphicsItem;
    scene->addItem(item);
}
QList <QGraphicsItem *> :: iterator iter;
int value;
for (iter = scene->items().begin(); iter != scene->items().end(); iter++)
{
    item = (GraphicsItem*)(*iter);
    tmp = item->myMember;
}
GraphicsItem - мой класс, наследованный от QGraphicsItem. При обращении к myMember (добавленное мной поле) происходит ошибка, точнее я вообще не могу обратиться ни к одному члену класса, кроме тех, что были в QGraphicsItem. Не могу понять, в чем дело:(
« Последнее редактирование: Сентябрь 26, 2007, 17:00 от finka » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Сентябрь 26, 2007, 16:34 »

А что за ошибку печатает? Возможно у тебя члены класса в private/protected секции. Сделай public аксессоры к твоим членам класса

Можешь показать код GraphicsItem?
« Последнее редактирование: Сентябрь 26, 2007, 16:38 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
finka
Гость
« Ответ #2 : Сентябрь 26, 2007, 16:43 »

Не, члены-то private, но функции доступа к ним public, и к членам я обращаюсь как раз через них, а ошибка происходит именно при обращению к члену (то есть уже в функции доступа). Сейчас посмотрела - там вообще все члены какие-то левые, в поле "value" написано: CXX0030: Error expression cannot be evaluated. А при обращении к какому-то члену класса, дебагер говорит :"0xC0000005: Access violation reading location 0xfeeefef2."
Записан
goer
Гость
« Ответ #3 : Сентябрь 26, 2007, 16:45 »

Вобще то для такого преобразования типов в С++ есть dynamic_cast - не стоит им пренебрегать Подмигивающий

И на будущее - телепаты уехали заграницу, там больше платят. Пожалуйста, описывайте проблемы так чтоб не приходилось флудить на форуме пустыми словами.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Сентябрь 26, 2007, 17:19 »

Приведи код GraphicsItem. У тебя гдето не инициализирован указатель. Проверь item на 0 после сроки:

item = (GraphicsItem*)(*iter);

Для приведения типа здесь достаточно static_cast.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
goer
Гость
« Ответ #5 : Сентябрь 26, 2007, 17:33 »

Приведи код GraphicsItem. У тебя гдето не инициализирован указатель. Проверь item на 0 после сроки:

item = (GraphicsItem*)(*iter);

Для приведения типа здесь достаточно static_cast.

Ребят, просил же, не разводите флуд и бесполезный флейм. Форуму это не на пользу, уважайте себя и других, не превращайте форум в помойку!
Цитировать
"Мудрый не все говорит, что знает, а дурак не все знает, что говорит."

Знатоки С++ идут лесом(упс!... читают Страуструпа).
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Сентябрь 26, 2007, 19:56 »

2 goer: А где флуд в моем посте? Последняя цитата в мой огород?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
vaprele07
Гость
« Ответ #7 : Сентябрь 27, 2007, 09:53 »

Цитировать
Знатоки С++ идут лесом(упс!... читают Страуструпа).
в раздел шаблоны  Строит глазки
Записан
finka
Гость
« Ответ #8 : Октябрь 01, 2007, 09:19 »

Заметила интересную вещь. Если в представленном мной коде последний кусок
Код:
for (iter = scene->items().begin(); iter != scene->items().end(); iter++)
{
    item = (GraphicsItem*)(*iter);
    tmp = item->myMember;
}

заменить на следующий:

Код:
for (int i = 0; i < scene->items().size(); i++)
{
    item = (GraphicsItem *)scene->items().at(i);
    tmp = item->myMember;
}
, то все пучком. Другое дело, что если использовать такой метод доступа к элементам списка нерационален по времени.
Кстати, когда вместо тупого приведения к типу (В первом варианте кода) я использовала dynamic_cast, то программа вылетала непосредственно в самом dynamic_cast. А во втором варианте dynamic_cast естесвенно работает.
Записан
vaprele07
Гость
« Ответ #9 : Октябрь 01, 2007, 11:36 »

finka попробуй вот это:
Код:
for (iter = scene->items().begin(); iter != scene->items().end(); iter++)
  qDebug() << "kosjk";
потом сравни кол-во косяков с кол-вом напиханных туда GraphicsItem  Шокированный

такая конструкция прежде всего говорит, что передаётся не ссылка а копия возможно итэмы вообще хранятся не в QList...
QList<QGraphicsItem *> QGraphicsScene::items () const
далее в конструкции iter != scene->items().end() сравниваются указатели не на данные а на Node * (внутренняя структура класса QList ) содержащий указатель на данные! отсюдова и...
так что второй пример работает без ошибок и возможно быстрее...
Записан
finka
Гость
« Ответ #10 : Октябрь 01, 2007, 12:19 »

Цитировать
потом сравни кол-во косяков с кол-вом напиханных туда GraphicsItem 

Естественно, количество косяков совпадает с кол-вом итемов.

Цитировать
такая конструкция прежде всего говорит, что передаётся не ссылка а копия возможно итэмы вообще хранятся не в QList...
QList<QGraphicsItem *> QGraphicsScene::items () const
Я с этим и не спорю.

Цитировать
далее в конструкции iter != scene->items().end() сравниваются указатели не на данные а на Node * (внутренняя структура класса QList ) содержащий указатель на данные! отсюдова и...
А вот это непонятно. Что отсюдова?
Записан
vaprele07
Гость
« Ответ #11 : Октябрь 01, 2007, 13:01 »

Цитировать
Естественно, количество косяков совпадает с кол-вом итемов.
нет не естественно Улыбающийся у меня не совпадает, но и не в падает в вечное зацикливание, возможно везение. В любом случае эта ошибка возможна и вам это скажет каждый, кто боле менее знаком с циклами в стиле си (тем более если вас самих интересует скорость как показатель).

К пример у меня ваша конструкция с преобразованиями не вызывает никаких ошибок при любых раскладах.
Записан
Tonal
Гость
« Ответ #12 : Октябрь 01, 2007, 13:17 »

Код:
QGraphicsScene * scene = new QGraphicsScene;
GraphicsItem * item;
for (int i = 0; i < MAX; i++)
{
    item = new GraphicsItem;
    scene->addItem(item);
}
[b]QList <QGraphicsItem *> :: iterator iter;[/b]
int value;
for (iter = scene->items().begin(); iter != scene->items().end(); iter++)
{
    item = (GraphicsItem*)(*iter);
    tmp = item->myMember;
}
GraphicsItem - мой класс, наследованный от QGraphicsItem.
Если ты привела полный код, то ошибка в выделенной строке.
Функция QGraphicsScene::items возвращает QList<QGraphicsItem *> где QGraphicsItem из стандартных заголовков Qt.
А в выделенной строке ты объявляешь итератор по QList<QGraphicsItem *> где QGraphicsItem определён тобой.
Не совсем понятно какое именно преобразование происходит при таком присвоении итераторов.
Попробуй переименовать свой класс, или явно прописать пространство имён для стандартного.

P.S. Кстати, какой компилятор и версия Qt?
P.P.S. Да, если на сцене присутствует хотя бы один итем не того типа, а например стандартного, то глюки тоже обеспечены. Для того чтобы их избежать пользуйся dynamic_cast-ом. Если же ты уверена, что такого быть не может ставь static_cast.
Я, обычно, делаю примерно так:
Код:
  assert(dynamic_cast<GraphicsItem*>(*iter));
  item = static_cast<GraphicsItem*>(*iter);
Т.е. при отладке получаешь assert, а в релизе не тормозит. ;-)
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #13 : Октябрь 01, 2007, 13:49 »

Есть еще такая функция: qgraphicsitem_cast

2 Tonal: что-то я не понял сказанное вами:

Цитировать
Функция QGraphicsScene::items возвращает QList<QGraphicsItem *> где QGraphicsItem из стандартных заголовков Qt.
А в выделенной строке ты объявляешь итератор по QList<QGraphicsItem *> где QGraphicsItem определён тобой.

У неё класс называеться GraphicsItem, который наследованный от QGraphicsItem

2 finka: Можете выложить полный код GraphicsItem?

Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Tonal
Гость
« Ответ #14 : Октябрь 01, 2007, 13:52 »

Точно, протупил. ;-)
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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