Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сохранение нескольких Qstring в QByteArray
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
MishaUA
У меня есть структура с определеными опциями, к примеру:
typedef struct {
    QString str1;
    QString Str2;
    int yy;
    struct {
        QString str3;
        QString Str4;
        bool uu;
    } struct2;
    // и еще куча разных переменных
} mainStruct;

Здесь хранятся настройки, мне их нужно писать/читать через ini файл, для этого, я помещал структуру в QByteArray и писал в файл. Проблема в том, что после чтения из ini файла, все строки QString не работают, если перед записью в нее была помещена какая то строка (если не была, то с нее читается пустая строка).
Оно и не удивительно, ведь QString - это класс.
Сейчас у меня на уме только один выход - заменить все строки в структуре на байтовые массивы (типа char str[100]), но с ними работать не удобно.
Может кто подскажет более оптимальный вариант?
Litkevich Yuriy
По делу:
Зарегистрируй свой тип данных с помощью qRegisterMetaType(), а затем помещай его в QSettings (см. также QVariant::value<...>() )


Просто так:
зачем тебе typedef?
структуры как и классы принято описывать так:
struct mainStruct {
    QString str1;
    QString Str2;
    int yy;
    struct {
        QString str3;
        QString Str4;
        bool uu;
    } struct2;
    // и еще куча разных переменных
};
MishaUA
а можно немного подробней на счет регистрации нового типа?
Просто из доки мне не сильно понятно:)
Litkevich Yuriy
Если ты не используешь свой тип данных в качестве аргументов сигналов и слотов, то тебе достаточно зарегистрировать тип с помощью макроса:
Q_DECLARE_METATYPE
(там пример понятный)
MishaUA
эм, как раз эту структуру я использую в качестве аргумента сигналов и слотов))))
MishaUA
а, стоп, я использую эту структуру в сигналах и слотах просто как структуру (точнее - указатель на нее). Значит, мне можно объявить новый тип данных просто с помощью Q_DECLARE_METATYPE?
Litkevich Yuriy
Цитата(MishaUA @ 5.7.2013, 13:26) *
Значит, мне можно объявить новый тип данных просто с помощью Q_DECLARE_METATYPE?
да
MishaUA
так, вот что я сделал:
struct mainStruct{
    QString str1;
    QString Str2;
    int yy;
    struct {
        QString str3;
        QString Str4;
        bool uu;
    } struct2;
    // и еще куча разных переменных
};
Q_DECLARE_METATYPE(mainStruct)

void MainWindow::on_pushButton_clicked()
{
    mainStruct mstr;
    QVariant var;
    var.setValue(mstr);
    userSettings->setValue("name", var);
}

Но при клике на pushButton, в дебугере пишет:
Цитата
QVariant::save: unable to save type 'mainStruct' (type id: 1037).

ASSERT failure in QVariant::save: "Invalid type to save", file kernel\qvariant.cpp, line 1869
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.

И программа вылетает.
Где я тупонул?:)
Litkevich Yuriy
Видимо, для QSettings придётся полностью описать тип.
Смотри это
MishaUA
тоесть, нужно описывать каждый элемент структуры?
Litkevich Yuriy
Нет, нужно создать операторы ввода/вывода в поток твоей структуры (пример в приведённой ссылке)
MishaUA
наверно, пока что сделаю строки в структуре в виде байтового массива, ато так писанины многовато, ато программку надо уже скоро доделать :vava:
Как появится время, попробую разобраться с операторами ввода/вывода в поток структуры)))
Litkevich Yuriy
Цитата(MishaUA @ 5.7.2013, 19:04) *
попробую разобраться с операторами ввода/вывода в поток структуры)))
чё там разбираться, по ссылке пример готовый
MishaUA
предположим, по вашей ссылке в примере сделано так:
struct s_SqlListInfo
        {
           QVariant queryName;
           QVariant dataBaseName;
           QList <QString> reqTableList;
           QString sqlStatement;
        };
// Qt MetaType Declaration
Q_DECLARE_METATYPE(s_SqlListInfo)

//оператор вывода:
QDataStream &operator<<(QDataStream &out, const s_SqlListInfo &myObj)
{
        out << myObj.queryName << myObj.dataBaseName << myObj.sqlStatement << myObj.reqTableList;
        return out;
}

тоесть, в out добавляется каждый элемент структуры. Как нужно сделать в моем случае?
Litkevich Yuriy
Цитата(MishaUA @ 9.7.2013, 1:03) *
Как нужно сделать в моем случае?
Из предыдущей фразы:
Цитата(MishaUA @ 9.7.2013, 1:03) *
в out добавляется каждый элемент структуры
мне думается, что вы понимаете как это сделать, но что вас останавливает?
MishaUA
да я просто изначально думал, как бы избавится от добавления каждого элемента, так как у меня их более 100 и все разные))))
Litkevich Yuriy
Цитата(MishaUA @ 9.7.2013, 16:39) *
так как у меня их более 100 и все разные))))
неудачное решение. При таком кол-во данных, настройки лучше в БД сохранять, тем более что есть SQLite.
MishaUA
уже сделал сохранение в Qsettings)))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.