Где находится sync () Linux?Запись данных в QSettings не сохраняется после закрытия приложения - PullRequest
0 голосов
/ 08 апреля 2019

Я работаю в Ubuntu и хочу хранить данные в QSettings. Во время выполнения данные сохраняются, после перезапуска приложения данные больше не читаются. Я читаю, что требуется дополнительный синхронный вызов linux, но я не могу найти, где это определено.

Во время выполнения программы я успешно записал данные в объект QSettings и прочитал значение из сохраненного объекта QSettings.

У меня есть пользовательский класс, который может читать и писать из / в QJSonObject


class User
{
public:
    User() {}
    User(const QString& ruser_name, const QImage& rdisplay_image)
    {
        user_name = ruser_name;
        display_image = rdisplay_image;
    }

    QString get_user_name() const { return user_name; }

    void write(QJsonObject &json) const
    {
        json["user_name"] = user_name;
        json["display_image"] = getImageInJsonValueFormat(display_image);

    }

    void read(const QJsonObject &json)
    {
        if (json.contains("user_name") && json["user_name"].isString())
            user_name = json["user_name"].toString();

        if (json.contains("display_image"))
            display_image = getImageFromJsonValueFormat(json["display_image"]);
    }
private:
    QString user_name;
    QImage  display_image;
};

Есть две глобальные функции для работы с изображением и Json


QJsonValue getImageInJsonValueFormat(const QImage& image)
{
    QByteArray image_ByteArray;
    if (image.isNull() != true)
    {
        QBuffer image_buffer(&image_ByteArray);
        image_buffer.open(QIODevice::WriteOnly);
        image.save(&image_buffer, "png");
        auto const encoded = image_buffer.data().toBase64();
        return {QLatin1String(encoded)};
    }
    return QLatin1String("");
}

QImage getImageFromJsonValueFormat(const QJsonValue& imageJsonValue)
{
    QImage image;
    auto const encoded = imageJsonValue.toString().toLatin1();
    image.loadFromData(QByteArray::fromBase64(encoded), "png");
    return image;
}

Кроме того, три функции, кроме чтения списка из QSettings, для создания списка по умолчанию и для сохранения списка в QSettings.

QMap<QString, User> Build_user_list()
{
    QMap<QString, User> user_list;
    User User1("baur",QImage("/home/Downloads/bechambaur.png"));
    user_list["baur"] = User1;

    User User2("Muller",QImage("/home/Downloads/GerdMuller.png"));
    user_list["Muller"] = User2;
    return user_list;
}

void StoreUserList(const QMap<QString, User> user_list)
{
    QJsonObject userListObject;
    QJsonArray userListArray;

    QMapIterator<QString,User> iterator(user_list);

    while (iterator.hasNext())
    {
        iterator.next();
        QJsonObject userJsonObject;
        User userObj = iterator.value();
        userObj.write(userJsonObject);
        userListArray.append(userJsonObject);
    }
    userListObject["user_list"] = userListArray;
    QJsonDocument userListDoc(userListObject);

    QSettings user_settings;

    user_settings.setValue("QSettingsApplication", userListDoc);
    user_settings.sync();
}

QMap<QString, User> GetStoredList()
{
    QMap<QString, User> user_list;
    QSettings user_settings;
    QJsonDocument userListDocRead = user_settings.value("QSettingsApplication", "").toJsonDocument();
    QJsonObject userListObjectRead = userListDocRead.object();//["userlist"];

    if (userListObjectRead.contains("user_list"))
    {
        if(userListObjectRead["user_list"].isArray())
        {
            QJsonArray userlistarray = userListObjectRead["user_list"].toArray();
            user_list.clear();
            for(int index = 0; index < userlistarray.size(); ++index)
            {
                QJsonObject json_user_object = userlistarray[index].toObject();
                User userObject;
                userObject.read(json_user_object);
                user_list[userObject.get_user_name()] = userObject;
            }
        }
    }

    return user_list;
}

С этим приложением, запущенным в последующие времена, не читается значение из QSettings, которое оно успешно считывает во время выполнения


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // Why below list is empty after first successful run?
    QMap<QString, User> user_listRead = GetStoredList();

    if (user_listRead.size() == 0)
    {
        QMap<QString, User> user_list = Build_user_list();
        StoreUserList(user_list);
        QMap<QString, User> user_listRead = GetStoredList();
        user_listRead = GetStoredList();
        // This is is not empty, it reads contents successfully. What's wrong?
    }
    MainWindow w;
    w.show();

    return a.exec();
}

Я ожидаю, что данные будут постоянными. Куда это идет не так?

Все содержимое файла

#include "mainwindow.h"
#include <QApplication>

#include <QString>
#include <QImage>
#include <QJsonObject>
#include <QBuffer>
#include <QSettings>
#include <QJsonArray>
#include <QJsonDocument>

QJsonValue getImageInJsonValueFormat(const QImage& image)
{
    QByteArray image_ByteArray;
    if (image.isNull() != true)
    {
        QBuffer image_buffer(&image_ByteArray);
        image_buffer.open(QIODevice::WriteOnly);
        image.save(&image_buffer, "png");
        auto const encoded = image_buffer.data().toBase64();
        return {QLatin1String(encoded)};
    }
    return QLatin1String("");
}

QImage getImageFromJsonValueFormat(const QJsonValue& imageJsonValue)
{
    QImage image;
    auto const encoded = imageJsonValue.toString().toLatin1();
    image.loadFromData(QByteArray::fromBase64(encoded), "png");
    return image;
}

class User
{
public:
    User() {}
    User(const QString& ruser_name, const QImage& rdisplay_image)
    {
        user_name = ruser_name;
        display_image = rdisplay_image;
    }

    QString get_user_name() const { return user_name; }

    void write(QJsonObject &json) const
    {
        json["user_name"] = user_name;
        json["display_image"] = getImageInJsonValueFormat(display_image);

    }

    void read(const QJsonObject &json)
    {
        if (json.contains("user_name") && json["user_name"].isString())
            user_name = json["user_name"].toString();

        if (json.contains("display_image"))
            display_image = getImageFromJsonValueFormat(json["display_image"]);
    }
private:
    QString user_name;
    QImage  display_image;
};

QMap<QString, User> Build_user_list()
{
    QMap<QString, User> user_list;
    User User1("baur",QImage("/home/Downloads/bechambaur.png"));
    user_list["baur"] = User1;

    User User2("Muller",QImage("/home/Downloads/GerdMuller.png"));
    user_list["Muller"] = User2;
    return user_list;
}

void StoreUserList(const QMap<QString, User> user_list)
{
    QJsonObject userListObject;
    QJsonArray userListArray;

    QMapIterator<QString,User> iterator(user_list);

    while (iterator.hasNext())
    {
        iterator.next();
        QJsonObject userJsonObject;
        User userObj = iterator.value();
        userObj.write(userJsonObject);
        userListArray.append(userJsonObject);
    }
    userListObject["user_list"] = userListArray;
    QJsonDocument userListDoc(userListObject);

    QSettings user_settings("userlist.conf", QSettings::NativeFormat);//(QSettings::IniFormat,QSettings::UserScope,"A","B");
    user_settings.setValue("QSettingsApplication", userListDoc.toVariant());

    user_settings.sync();
}

QMap<QString, User> GetStoredList()
{
    QMap<QString, User> user_list;
    QSettings user_settings("userlist.conf", QSettings::NativeFormat);

    QVariant qvarval = user_settings.value("QSettingsApplication");

    QJsonDocument userListDocRead = user_settings.value("QSettingsApplication").toJsonDocument();
    QJsonObject userListObjectRead = userListDocRead.object();//["userlist"];

    if (userListObjectRead.contains("user_list"))
    {
        if(userListObjectRead["user_list"].isArray())
        {
            QJsonArray userlistarray = userListObjectRead["user_list"].toArray();
            user_list.clear();
            for(int index = 0; index < userlistarray.size(); ++index)
            {
                QJsonObject json_user_object = userlistarray[index].toObject();
                User userObject;
                userObject.read(json_user_object);
                user_list[userObject.get_user_name()] = userObject;
            }
        }
    }

    return user_list;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMap<QString, User> user_listreRead;



    // Why below list is empty after first successful run?
    QMap<QString, User> user_listRead = GetStoredList();

    if (user_listRead.size() == 0)
    {
        QMap<QString, User> user_list = Build_user_list();
        StoreUserList(user_list);
        user_listreRead = GetStoredList();
        // This is is not empty, it reads contents successfully. What's wrong?
    }


    MainWindow w;
    w.show();

    return a.exec();
}

Содержимое userlist.conf:

[General]
QSettingsApplication=@Variant(\0\0\0\b\0\0\0\x1\0\0\0\x12\0u\0s\0\x65\0r\0_\0l\0i\0s\0t\0\0\0\t\0\0\0\x2\0\0\0\b\0\0\0\x2\0\0\0\x12\0u\0s\0\x65\0r\0_\0n\0\x61\0m\0\x65\0\0\0\n\0\0\0\f\0M\0u\0l\0l\0\x65\0r\0\0\0\x1a\0\x64\0i\0s\0p\0l\0\x61\0y\0_\0i\0m\0\x61\0g\0\x65\0\0\0\n\0\0\0\0\0\0\0\b\0\0\0\x2\0\0\0\x12\0u\0s\0\x65\0r\0_\0n\0\x61\0m\0\x65\0\0\0\n\0\0\0\b\0\x62\0\x61\0u\0r\0\0\0\x1a\0\x64\0i\0s\0p\0l\0\x61\0y\0_\0i\0m\0\x61\0g\0\x65\0\0\0\n\0\0\0\0)

...