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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Получить собственные данные из QSettings  (Прочитано 3412 раз)
0...-5
Гость
« : Январь 11, 2013, 10:20 »

Здравствуйте, у меня возникла такая проблема:
Я разработал некоторый класс для хранения данных, зарегистрировал его в мета-объектной системе макросом q_declare_metatype(), определил потоковые операторы <</>> и зарегистрировал их с помощью  qRegisterMetaTypeStreamOperators().

После этого я попытался получить свой класс из объекта QSettings и заметил следующую вещь:
вызов
Код:
MyClass c = qvariant_cast<MyClass>(settings.value("key"))
приводит к ошибке segmentation fault при вызове функции
Код:
void QMetaType::destroy(int type, void *data)
Если же выполнить нечто вроде
Код:
QVariant value = settings.value("key");
MyClass c = qvariant_cast<MyClass>(value);
то ошибка не возникает.

В чем здесь дело?
« Последнее редактирование: Январь 11, 2013, 10:23 от 0...-5 » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Январь 11, 2013, 23:01 »

Могу ошибаться, но разве QVariant не хранит просто указатель?

ведь вы в QVariant поместили ссылку/указатель(1), и ее извлекли - нормально, ведь данные на которые (1) указывала существуют...

а QSettings производит чтение/запись в файл (реестр/ini-файл), и в него таким макаром просто запишете (1), а (1) просто набор байтов
и когда будете с помощью QSettings вытаскивать (1) из файла может оказаться что (1) указывает хрен-знает-куда и программа падает

ведь сами написали, какая вылезла ошибка, а именно ошибка сегментации, вики говорит, что это:
"Ошибка сегментации (англ. Segmentation fault или сокращённо segfault) — ошибка программного обеспечения, возникающая при попытке обращения к недоступным для записи участкам памяти либо при попытке изменения памяти запрещённым способом."
Записан

gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Январь 11, 2013, 23:07 »

Если ваш класс не имеет неограниченное количество значений, которые нужно записывать, то стоит в QSettings записывать именно это значения Улыбающийся
если что, QSettings может и массивы записывать/считывать Подмигивающий
Записан

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

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Январь 12, 2013, 01:38 »

то ошибка не возникает.

В чем здесь дело?
Наверное тоже возникает, только позже, когда value выйдет за пределы видимости. Нужно проверить конструктор копирования для MyClass
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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