crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Создание и работа с объектами класса - наследника QGraphicsScene
AlexandrosLiberalis
  опции профиля:
сообщение 21.7.2014, 23:53
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 21.7.2014
Пользователь №: 4193

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




Репутация:   0  


Всем привет!
Новичок.

Создал класс Node:
class Node : public QGraphicsItem
{
public:
Node();
int v; // counter for marking the nodes
QString n; //the same counter used in drawText of nodes
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
bool Pressed;

protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);

};

В диалоге его объявил:
Node *node;

и начал использовать:
node = new Node[10];
при нажатии кнопки добавляю новый:
scene->addItem(node+n);
и так далее. Всё работает прекрасно.
Но когда добавляю ещё один класс - наследник QGraphicsItem (скажем class Edge : public QGraphicsItem) с точно такими же функциями (методами) как и с предыдущим Node - не работает.
Уже только при объявлении второго объекта Edge *edge; происходит ошибка, вернее "программа неожиданно завершилась"
Подскажите пожалуйста, в чём может быть проблема.


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AlexandrosLiberalis
  опции профиля:
сообщение 22.7.2014, 11:11
Сообщение #2


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 21.7.2014
Пользователь №: 4193

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




Репутация:   0  


Я извиняюсь, в названии темы конечно речь идёт о наследниках QGraphicsItem
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 22.7.2014, 19:23
Сообщение #3


Старейший участник
****

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

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




Репутация:   8  


Приложите пожалуйста полностью маленький проект который будет собиратся и падать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AlexandrosLiberalis
  опции профиля:
сообщение 22.7.2014, 20:40
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 21.7.2014
Пользователь №: 4193

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




Репутация:   0  


Вот.

Я посмотрел вот это туториал http://www.youtube.com/watch?v=hgDd2QspuDg...D1942A4688E9D63 , немного его переделал и получилась программа которая добавляет вершины (в дальнейшем это вершины графа). Следующим делом хотел создать ещё один класс объектов (в дальнейшем дуги), и сделал точно такой же класс (с теми же функциями), но только начинаю работать с ним MySquare *mysquare; - ошибка. Расскажите пожалуйста, как вообще на практике правильно начинать работать с объектами.

Прикрепленные файлы
Прикрепленный файл  FF.ZIP ( 6.31 килобайт ) Кол-во скачиваний: 174
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 22.7.2014, 23:38
Сообщение #5


Старейший участник
****

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

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




Репутация:   8  


Начнем ^_^

scene = new QGraphicsScene(scene);

Здесь в качестве родителя для scene используется неинициализированный указатель scene.
Надо подставить другого родителя, например Dialog:
scene = new QGraphicsScene(this);


node = new Node[10];

Выделяется как массив, удалятся должен тоже как массив:
delete[] node;


Когда вы удаляете сцену, удаляются все объекты на ней. Из описания addItem:
Цитата
Adds or moves the item and all its childen to this scene. This scene takes ownership of the item

Поэтому когда удаляется массив node, те элементы которые были добавлены на сцену удалятся второй раз.
Поэтому не нужно отдельно хранить его, сцена подчистит за собой.
 if (n <= 9)
    {

    Node * newNode = new Node;
    scene->addItem(newNode);

    newNode -> v = n + 1;
n++;
    }

Если нужно хранить узлы для своих целей, просто заведите массив:
QVector<Node*> nodes;

И добавляйте в него:
 if (n <= 9)
    {

    Node * newNode = new Node;
    scene->addItem(newNode);

    newNode -> v = n + 1;
n++;
    nodes.append(newNode);
    }

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

Тут еще одна тонкость.
Вы выделяете node векторным new, а QGraphicsScene удаляет скалярным деструктором, получается что то вроде:
    int *ad = new int[12];
    delete ad;

Это неопределенное поведение, Undefined Behavior.
Интересна статья на тему:
http://blogs.msdn.com/b/oldnewthing/archiv...2/03/66660.aspx
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AlexandrosLiberalis
  опции профиля:
сообщение 23.7.2014, 9:20
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 21.7.2014
Пользователь №: 4193

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




Репутация:   0  


Огромное спасибо!!! Всё заработало!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 24.4.2024, 1:46