crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Сохранение нескольких Qstring в QByteArray
MishaUA
  опции профиля:
сообщение 5.7.2013, 3:45
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


У меня есть структура с определеными опциями, к примеру:
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
  опции профиля:
сообщение 5.7.2013, 4:35
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


По делу:
Зарегистрируй свой тип данных с помощью qRegisterMetaType(), а затем помещай его в QSettings (см. также QVariant::value<...>() )


Просто так:
зачем тебе typedef?
структуры как и классы принято описывать так:
struct mainStruct {
    QString str1;
    QString Str2;
    int yy;
    struct {
        QString str3;
        QString Str4;
        bool uu;
    } struct2;
    // и еще куча разных переменных
};
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 5.7.2013, 10:08
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


а можно немного подробней на счет регистрации нового типа?
Просто из доки мне не сильно понятно:)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.7.2013, 10:20
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Если ты не используешь свой тип данных в качестве аргументов сигналов и слотов, то тебе достаточно зарегистрировать тип с помощью макроса:
Q_DECLARE_METATYPE
(там пример понятный)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 5.7.2013, 10:43
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


эм, как раз эту структуру я использую в качестве аргумента сигналов и слотов))))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 5.7.2013, 11:26
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


а, стоп, я использую эту структуру в сигналах и слотах просто как структуру (точнее - указатель на нее). Значит, мне можно объявить новый тип данных просто с помощью Q_DECLARE_METATYPE?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.7.2013, 11:47
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(MishaUA @ 5.7.2013, 13:26) *
Значит, мне можно объявить новый тип данных просто с помощью Q_DECLARE_METATYPE?
да
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 5.7.2013, 14:19
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


так, вот что я сделал:
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
  опции профиля:
сообщение 5.7.2013, 15:03
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Видимо, для QSettings придётся полностью описать тип.
Смотри это
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 5.7.2013, 16:11
Сообщение #10


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


тоесть, нужно описывать каждый элемент структуры?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 14:52