Создание и работа с объектами класса - наследника QGraphicsScene |
Здравствуйте, гость ( Вход | Регистрация )
Создание и работа с объектами класса - наследника 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; - ошибка. Расскажите пожалуйста, как вообще на практике правильно начинать работать с объектами.
Прикрепленные файлы
|
|
|
lanz |
22.7.2014, 23:38
Сообщение
#5
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
Начнем
Здесь в качестве родителя для scene используется неинициализированный указатель scene. Надо подставить другого родителя, например Dialog:
Выделяется как массив, удалятся должен тоже как массив:
Когда вы удаляете сцену, удаляются все объекты на ней. Из описания addItem: Цитата Adds or moves the item and all its childen to this scene. This scene takes ownership of the item Поэтому когда удаляется массив node, те элементы которые были добавлены на сцену удалятся второй раз. Поэтому не нужно отдельно хранить его, сцена подчистит за собой.
Если нужно хранить узлы для своих целей, просто заведите массив:
И добавляйте в него:
Помните только что при удалении объекта со сцены нужно удалять его и из массива, иначе может получится висящий указатель. Тут еще одна тонкость. Вы выделяете node векторным new, а QGraphicsScene удаляет скалярным деструктором, получается что то вроде:
Это неопределенное поведение, 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 |
Огромное спасибо!!! Всё заработало!
|
|
|
Текстовая версия | Сейчас: 24.4.2024, 1:46 |