Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 访问我的应用程序中的QSettings_C++_Qt_Qsettings - Fatal编程技术网

C++ 访问我的应用程序中的QSettings

C++ 访问我的应用程序中的QSettings,c++,qt,qsettings,C++,Qt,Qsettings,我正在尝试为我的Qt应用程序实现应用程序设置。 我正在使用QSettings,创建了一个类的实例,如下所示 settings = new QSettings(qApp->organizationName(), qApp->applicationName()); 我想知道:通过我的应用程序访问我的设置的最佳方式是什么 我需要从不同的类访问一些设置,但我不知道我是否必须只声明和创建一个QSettings实例,并使其在我需要的任何地方都可以访问,或者我是否可以在需要访问一些设置的地方创建

我正在尝试为我的Qt应用程序实现应用程序设置。 我正在使用
QSettings
,创建了一个类的实例,如下所示

settings = new QSettings(qApp->organizationName(), qApp->applicationName());
我想知道:通过我的应用程序访问我的设置的最佳方式是什么


我需要从不同的类访问一些设置,但我不知道我是否必须只声明和创建一个QSettings实例,并使其在我需要的任何地方都可以访问,或者我是否可以在需要访问一些设置的地方创建本地的
QSettings实例,最好的办法是实现单点设计模式来分配QSET对象,但是要记住,如果你与QSettings共享,你必须处理原子持久性,我的意思是,为了在C++类中保存一些数据,你需要使用SythSyc()方法。我知道您不需要在QML层中使用设置。如果是这种情况,您可以查看方法,以便在QML中使用该方法。

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

如Qt的文档所述,不需要使用单音:

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

然后,在创建QApplication之后:

QApplication app(argc, argv);
QSettings settings;
settings.setValue("example", 68);
设置不同的默认参数:

QCoreApplication::setOrganizationName("MySoft");
QCoreApplication::setOrganizationDomain("mysoft.com");
QCoreApplication::setApplicationName("Star Runner");
如果要使用QSettingsm,只需使用默认构造函数,该构造函数将从核心应用程序获取默认参数:

QApplication app(argc, argv);
QSettings settings;
settings.setValue("example", 68);
在QML下,备选方案是,SETP相同,配置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
}

正如Qt的文档所说,不需要使用单音:

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

然后,在创建QApplication之后:

QApplication app(argc, argv);
QSettings settings;
settings.setValue("example", 68);
设置不同的默认参数:

QCoreApplication::setOrganizationName("MySoft");
QCoreApplication::setOrganizationDomain("mysoft.com");
QCoreApplication::setApplicationName("Star Runner");
如果要使用QSettingsm,只需使用默认构造函数,该构造函数将从核心应用程序获取默认参数:

QApplication app(argc, argv);
QSettings settings;
settings.setValue("example", 68);
在QML下,备选方案是,SETP相同,配置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
}

为了在您的整个应用程序中设置全局设置,
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
\ifndef GLOBALSETTINGS\u H
#定义全局设置
#包括
#包括
类全局设置
{
公众:
Q_禁用_复制(全局设置)
静态全局设置*getSettings();
//设置getter和setter
QString设置1()常量;
无效设置设置1(常量字符串和设置1);
QString设置2()常量;
无效设置设置2(常量字符串和设置2);
私人:
//私有构造函数
全局设置();
静态全局设置*m_设置;
QSettings*设置;
//设置成员
QString m_设置1;
QString m_设置2;
};
#endif//GLOBALSETTINGS\u 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);
}
#包括“globalsettings.h”
#包括
GlobalSettings*GlobalSettings::m_Settings=NULL;
GlobalSettings::GlobalSettings()
{
设置=新的QSettings(qApp->organizationName(),qApp->applicationName());
如果(!设置->包含(“设置1”))
{
设置->设置值(“设置1”,“某物”);//默认值
}
其他的
{
m_Setting1=设置->值(“设置1”).toString();
}
如果(!设置->包含(“设置2”))
{
设置->设置值(“设置2”,“某物”);//默认值
}
其他的
{
m_Setting2=设置->值(“设置2”).toString();
}
设置->同步();
}
GlobalSettings*GlobalSettings::getSettings()
{
如果(m_设置==NULL)
{
m_设置=新的全局设置();
}
返回m_设置;
}
QString GlobalSettings::Setting1()常量
{
返回m_设置1;
}
无效全局设置::设置设置1(常量q字符串和设置1)
{
m_设置1=设置1;
设置->设置值(“设置1”,设置1);
}
QString全局设置::设置2()常量
{
返回m_设置2;
}
无效全局设置::设置设置2(常量QString和设置2)
{
m_设置2=设置2;
设置->设置值(“设置2”,设置2);
}
下面是如何在你想用的地方使用它

#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();
}
#包括“mainwindow.h”
#包括
#包括
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
GlobalSettings*设置=GlobalSettings::getSettings();
qDebug()设置1();
主窗口w;
w、 show();
返回a.exec();
}

现在,如果你想拥有线程安全设置类,你可以在get和setter函数中锁定一个互斥锁,以便在你的整个应用程序中有一个全局设置,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
\ifndef GLOBALSETTINGS\u H
#定义GLOBALSETT