Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Создание и работа с объектами класса - наследника QGraphicsScene
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Система рисования. Печать
AlexandrosLiberalis
Всем привет!
Новичок.

Создал класс 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
Я извиняюсь, в названии темы конечно речь идёт о наследниках QGraphicsItem
lanz
Приложите пожалуйста полностью маленький проект который будет собиратся и падать.
AlexandrosLiberalis
Вот.

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

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
Огромное спасибо!!! Всё заработало!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.