BadCats
@BadCats

Exception при добавлении QGraphicsItem на сцену?

Класс ball:
#endif // BALL_H

ball.cpp:
#include "ball.h"

ball::ball(int x, int y,int R)
{
    this->x=x+10;
    this->y=y;
    this->R=R;
    ballObj = new QGraphicsEllipseItem(x,y,R,R);

}
void ball::setPos(int newX, int newY)
{
    this->x=newX;
    this->y=newY;
}
void ball::setSpeed(int newSpeed)
{
    this->speed=newSpeed;
}
QGraphicsEllipseItem* ball::getBall()
{
    return  this->ballObj;
}
QPoint ball::getPos()
{
    return QPoint(this->x,this->y);
}
int ball::getSpeed()
{
    return  this->speed;
}

Создание объекта:
ballObj=new ball(0,this->height(),10);

    gameBoard->scene()->addItem( ballObj->getBall());

Консруктор - отрабатывает нормально - смотрел под отладчиком:
5e8b36b4b0901820264840.png
скриншот следующего шага после срабатывания точки останова
, но при попытке добавить на сцену -получаю SegmentationFault - см скриншот:
5e8b36ee6a442193137542.png
  • Вопрос задан
  • 32 просмотра
Пригласить эксперта
Ответы на вопрос 1
vt4a2h
@vt4a2h
Senior software engineer (C++/Qt/boost)
В C++ все указатели надо проверять на null перед использованием. У вас явно какой-то указатель null.
Вот этот код ещё выглядит подозрительным:
allObj=new ball(0,this->height(),10);
gameBoard->scene()->addItem( ballObj->getBall());

Результат new присваивается одной переменной, а потом используется другая. Допускаю, что это опечатка.
Как я уже и писал выше, надо проверить результат вызова scene() на null (скорее всего, именно тут ошибка), равно как и сам gameBoard.
И ещё одно, вы должны понимать, что после вызова метода addItem(ballObj->getBall()), возвращённый объект перейдёт под управление сцены (об этом в документации написано) и может быть удалён в любой момент. При этом, кто должен удалить ballObj в вашем коде не ясно.

PS
Это не исключение.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
09 мая 2021, в 12:34
2500 руб./за проект
09 мая 2021, в 12:06
1000 руб./за проект