在我的应用程序中访问QSettings
Access QSettings in my app
我正在尝试为我的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 函数中锁定互斥锁
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 从C++dll访问C#中的一行主要参数
- 概念TS检查忽略私有访问修饰符
- 访问被拒绝后,c++中的故障保护代码
- 在c++中访问int到类对象的映射时出错
- 我想访问std::unique_ptr中的一个特定元素
- 为什么示例代码访问IUnknown中已删除的内存
- C++:无法访问声明的受保护成员
- 在我的应用程序中访问QSettings
- qt的QSettings访问Android中的共享首选项