在我的应用程序中访问QSettings

Access QSettings in my app

本文关键字:访问 QSettings 应用程序 我的      更新时间:2023-10-16

我正在尝试为我的Qt应用程序实现应用程序设置。我正在使用QSettings,像这样创建了一个我的类实例

settings = new QSettings(qApp->organizationName(), qApp->applicationName());

并且想知道:通过我的应用程序访问我的设置的最佳方式是什么

我将需要访问来自不同类的某些设置,但我不知道我是否必须声明并创建一个 QSettings 实例并使其在我需要的任何地方都可以访问,或者我是否可以创建需要访问某些设置的QSettings的本地实例。

没有必要

使用单调,正如Qt的文档所说,QSettings:

如果在应用程序中的多个位置使用 QSettings,则可能需要使用 QCoreApplication::setOrganizationName() 和 QCoreApplication::setApplicationName() 指定组织名称和应用程序名称,然后使用默认的 QSettings 构造函数:

然后,在创建 QApplication 之后:

QApplication app(argc, argv);

设置,不同的默认参数:

QCoreApplication::setOrganizationName("MySoft");
QCoreApplication::setOrganizationDomain("mysoft.com");
QCoreApplication::setApplicationName("Star Runner");

当您想要使用 QSettingsm 时,只需使用默认构造函数,该构造函数将从核心应用程序中获取默认参数:

QSettings settings;
settings.setValue("example", 68);

在 QML 下,替代方案是设置,设置相同,配置您的 gui 应用程序:

QGuiApplication app(argc, argv);
app.setOrganizationName("Some Company");
app.setOrganizationDomain("somecompany.com");
app.setApplicationName("Amazing Application");

在 QML 中,设置不同的设置:

Settings {
   property alias x: window.x
   property alias y: window.y
   property alias width: window.width
   property alias height: window.height
}

在我看来,最好的方法是实现单例设计模式来分配 QSettings 对象,但请记住,如果您共享 QSettings,您必须处理原子持久性,我的意思是,有时需要使用 sync() 方法来跨C++类持久化一些数据。我知道您不需要在 QML 层中使用设置。如果是这种情况,您可以查看qmlRegisterSingletonType方法,以便在QML中使用它。

为了在整个应用程序中有一个全局设置,singleton可能是一个好主意,我有一个设置类的模式,我在这里发布可能对你和其他人有用。

在这里,我有一个单例类GlobalSettings下面是标头和 cpp 文件。

头文件 :

#ifndef GLOBALSETTINGS_H
#define GLOBALSETTINGS_H
#include <QSettings>
#include <QObject>
class GlobalSettings
{
public:
    Q_DISABLE_COPY(GlobalSettings)
    static GlobalSettings* getSettings();
    // Settings getter and setters
    QString Setting1() const;
    void setSetting1(const QString &Setting1);
    QString Setting2() const;
    void setSetting2(const QString &Setting2);
private:
    // private constructor
    GlobalSettings();
    static GlobalSettings * m_Settings;
    QSettings * settings;
    // Settings memebers
    QString m_Setting1;
    QString m_Setting2;
};
#endif // GLOBALSETTINGS_H

和全局设置的 cpp 文件

#include "globalsettings.h"
#include <QCoreApplication>
GlobalSettings * GlobalSettings::m_Settings = NULL;
GlobalSettings::GlobalSettings()
{
    settings = new QSettings(qApp->organizationName(), qApp->applicationName());
    if (!settings->contains("Setting1"))
    {
        settings->setValue("Setting1","Something"); //  default value
    }
    else
    {
        m_Setting1 = settings->value("Setting1").toString();
    }
    if (!settings->contains("Setting2"))
    {
        settings->setValue("Setting2","Something"); //  default value
    }
    else
    {
        m_Setting2 = settings->value("Setting2").toString();
    }
    settings->sync();
}
GlobalSettings *GlobalSettings::getSettings()
{
    if (m_Settings == NULL)
    {
        m_Settings =  new GlobalSettings();
    }
    return m_Settings;
}
QString GlobalSettings::Setting1() const
{
    return m_Setting1;
}
void GlobalSettings::setSetting1(const QString &Setting1)
{
    m_Setting1 = Setting1;
    settings->setValue("Setting1",Setting1);
}
QString GlobalSettings::Setting2() const
{
    return m_Setting2;
}
void GlobalSettings::setSetting2(const QString &Setting2)
{
    m_Setting2 = Setting2;
    settings->setValue("Setting2",Setting2);
}

这是如何在您想使用的地方使用它

#include "mainwindow.h"
#include <QApplication>
#include <QDebug>
#include <globalsettings.h>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    GlobalSettings * setting = GlobalSettings::getSettings();
    qDebug() <<  setting->Setting1();

    MainWindow w;
    w.show();
    return a.exec();
}

现在,如果您想拥有线程安全设置类,您可以在 get 和 setter 函数中锁定互斥锁