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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Сериализация QSettings  (Прочитано 12452 раз)
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« : Август 28, 2012, 16:39 »

Хотелось бы сериализовать QSettings в QByteArray, получить строку и передать ее по сети. На другой стороне из строки десериализовать.
В лоб не получается.
Код
C++ (Qt)
QSettings cfg;
cfg.setValue("user/name", 1);
 
QByteArray data;
QBuffer buffer(&data);
buffer.open(QIODevice::ReadWrite);
QDataStream out(&buffer);
out << cfg;
 
Компилятор говорит D:\Temp\.Mycop\-\seet\main.cpp:18: ошибка: C2679: binary '<<' : no operator found which takes a right-hand operand of type 'QSettings' (or there is no acceptable conversion)...

Какие ещё есть варианты?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Август 28, 2012, 16:45 »

http://doc-snapshot.qt-project.org/4.8/qsettings.html#registerFormat
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #2 : Август 28, 2012, 16:58 »

Читал уже. Чем это поможет?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Август 29, 2012, 09:19 »

Вообще, у тебя есть http://doc-snapshot.qt-project.org/4.8/qsettings.html#allKeys и http://doc-snapshot.qt-project.org/4.8/qsettings.html#value. Этого хватит с головой.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #4 : Август 29, 2012, 11:18 »

Т.е. предлагается получить через allkeys все ключи, потом в цикле получить все значения, запихать всё это, например в QMap, сериализовать в QDataStream, дальше передать его по сети, на другом конце десериализовать и пользоваться? Как то уж очень некрасиво.
Вот если бы была возможность как-нибудь получить доступ к тому самому QSettings::SettingsMap &map, который передаётся в ReadFunc/WriteFunc...
Записан
Serr500
Гость
« Ответ #5 : Август 29, 2012, 12:17 »

Так в ReadFunc/WriteFunc и получайте.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #6 : Август 29, 2012, 14:03 »

Может я чего-то не понимаю? Вот я зарегистрировал собственный формат для QSettings определив соответствующие  ReadFunc/WriteFunc, например
Код
C++ (Qt)
bool readBinFile(QIODevice &device, QSettings::SettingsMap &map)
{
    map << device;
}
 
bool writeBinFile(QIODevice &device, const QSettings::SettingsMap &map)
{
    device << map;
}
 
int main(int argc, char *argv[])
{
    const QSettings::Format BinFormat =
            QSettings::registerFormat("bin", readBinFile, writeBinFile);
 
    QSettings settings(BinFormat);
 
}
 

И куда теперь при settings.sync() всё это запишется - в файл с расширением ".bin", который мне теперь надо считать в QByteArray  с диска и и потом удалить? А потом перед чтением опять же записать на диск, загрузить оттуда в QSettings и удалить файл?
На мой взгляд это вообще ни в какие вороте не лезет.
« Последнее редактирование: Август 29, 2012, 14:05 от xokc » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #7 : Август 29, 2012, 14:29 »

так QSettings не даёт доступа к внутренним данным, костыли будут в любом случае. Свой формат тут вообще ни при чём. Я бы использовал QSettings::IniFormat и передавал по сети именно этот текстовый файл при этом сделав setFallbacksEnabled(false).
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #8 : Август 29, 2012, 14:41 »

Свой формат тут вообще ни при чём.
Я об этом же пытаюсь говорить начиная с поста № 3 в этой теме, а мне уже дважды советуют к этому вопросу вернуться.

передавал по сети именно этот текстовый файл при этом сделав setFallbacksEnabled(false).
Ну уж нет - в файлы я сохранять ничего не буду. Уж лучше через allKeys и value. Или вообще от QSettings уйти.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Август 29, 2012, 14:46 »

registerFormat и в writeBinFile запихиваешь все в глобальную переменную, игнорируя QIODevice.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #10 : Август 29, 2012, 15:20 »

Ну уж нет - в файлы я сохранять ничего не буду. Уж лучше через allKeys и value. Или вообще от QSettings уйти.

QSettings и так сохраняется в файл, если задан формат INI, всё что нужно - сделать sync(), и передать файл по сети. На принимающей стороне этот файл нужно положить в нужное место и создать/пересоздать объект QSettings, всё...
« Последнее редактирование: Август 29, 2012, 15:42 от Alex Custov » Записан
Serr500
Гость
« Ответ #11 : Август 29, 2012, 15:24 »

Ну уж нет - в файлы я сохранять ничего не буду.

http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qbuffer.html - QIODevice над QByteArray.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #12 : Август 29, 2012, 15:44 »

1.
registerFormat и в writeBinFile запихиваешь все в глобальную переменную, игнорируя QIODevice.
Так-то понятно. Дальше возникают проблемы с многопоточностью и прочие прелести глобальных переменных. Тоже корявенько как-то.

2.
QSettings и так сохраняется в файл, если задан формат INI, всё что нужно - сделать sync(), и передать файл по сети. На принимающей стороне этот файл нужно положить в нудное место и создать/пересоздать объект QSettings, всё...
Тоже понятно. Но не нужно мне в файл сохранять! С моей точки зрения еще хуже, чем п. 1.

3.
QIODevice над QByteArray.
Да проблема совсем не в этом. См. пп. 1 и 2.
Записан
Zerkin
Чайник
*
Offline Offline

Сообщений: 98


Просмотр профиля
« Ответ #13 : Декабрь 16, 2015, 10:49 »

Прошу меня извинить за ап такой старой темы. Хотелось бы узнать у топикстартера (насколько я знаю, он активно посещает форум), решил ли он тогда эту проблему? У меня появилась схожая задача, необходимо запихнуть QSetting во что-то типа QByteArray, без всяких файлов и прочего.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #14 : Декабрь 16, 2015, 11:46 »

Вот же
Вообще, у тебя есть http://doc-snapshot.qt-project.org/4.8/qsettings.html#allKeys и http://doc-snapshot.qt-project.org/4.8/qsettings.html#value. Этого хватит с головой.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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