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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QObject dynamic property  (Прочитано 4106 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Ноябрь 04, 2013, 14:53 »

Добрый день

Верно ли я понял что:

- сам QObject (и его потомки) не могут храниться как dynamic property (setProperty и.т.д.) т.к. значение QVariant. Разрешается хранить только  указатель (QObject *)

- при удалении такой проперди объект не удаляется автоматом, я должен обеспечить сам (напр пройдясь по всем пропердям)

Спасибо
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Ноябрь 05, 2013, 11:58 »

- сам QObject (и его потомки) не могут храниться как dynamic property (setProperty и.т.д.) т.к. значение QVariant. Разрешается хранить только  указатель (QObject *)
Потомки могут храниться в QVariant, но нужен конструктор копирования (храниться будет копия).
Ну и Q_DECLARE_METATYPE надо будет указать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Ноябрь 05, 2013, 19:51 »

Потомки могут храниться в QVariant, но нужен конструктор копирования (храниться будет копия).
Ну и Q_DECLARE_METATYPE надо будет указать.
Да, если выполнить эти правила - то компиляция проходит. Но что мне делать в конструкторе копирования (ведь присвоить базовый QObject я не могу)?

Спасибо

Edit: может в конструкторе копирования сначала позвать обычный конструктор, а потом копировать из аргумента "что можно". Если ли др возможности?
« Последнее редактирование: Ноябрь 05, 2013, 20:03 от Igors » Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #3 : Ноябрь 06, 2013, 10:05 »

Положи QObject в QSharedPointer, тогда, хотя-бы, удалять руками не будешь. При этом важно отследить, чтобы родитель QObject не убил объект раньше чем это сделает QSharedPointer.
Записан

Гугль в помощь
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #4 : Ноябрь 06, 2013, 10:21 »

может в конструкторе копирования сначала позвать обычный конструктор, а потом копировать из аргумента "что можно". Если ли др возможности?
Обычный конструктор QObject (ну или другого родителя) я так понимаю? Ну хотя если у вас C++11, то можно и делегирующий конструктор использовать.
А так да, кроме копирования полей вручную тут особо ничего не сделаешь.
Ну разве что класс реализует implicitly share (через QSharedDataPointer и QSharedData, например), тогда копирование будет проще, но всё остальное сложнее. Улыбающийся По сути это будет обёртка для умного указателя.

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Ноябрь 06, 2013, 13:39 »

Родителей нет, проперди используются как данные-переменные для скритпов (не виджеты). С умными указателями здесь вроде больше мороки чем пользы (напр а кто тот "хотя бы 1 использующий" - хз). Дадно, добавил в деструктор проход по пропердям с удалением указателкй на QObject. Поскольку проперди в виде дерева - "достаточно одной таблэтки".

Спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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