在Qt编程中使用QSettings库为软件加上设置功能

在编写软件的时候,我们经常需要保存一些用户的设置,可以用数据库保存,也可以用文本保存。Qt提供了QSettings类实现这个功能,通过这个类保存的设置,在Windows上设置会被保存到注册表,在macOS上会被保存到属性列表文件,在Unix上通常会被保存到ini文件。

先来编写软件使用QSettings类的代码的头文件,在头文件引入QSettings。然后创建一个QSettings指针,定义好设定和获取设置的函数。

#include <QSettings>
#include <QString>

class Settings : public QObject
{
Q_OBJECT
    QSettings* settings;

public:
    explicit Settings(QObject *parent = 0);

    Q_INVOKABLE void set_date_format(date_format f);

    Q_INVOKABLE int get_date_format();
};

然后是源代码文件。新建一个QSettings对象,两个参数分别是公司名称和产品名称,不过对于个人写的软件来说,填什么也没所谓啦。而无论是setValue还是value函数,都是以键值对的形式来操作,第一个参数是键,第二个参数是要设定或者获取到的值。

#include "settings.h"
#include <qdebug.h>

Settings::Settings(QObject *parent) {
    settings = new QSettings("Company name","Product name");
}

void Settings::set_date_format(date_format f) {
    settings->setValue(QString("Date_format"),QVariant(f));
}

int Settings::get_date_format() {
    return settings->value(QString("Date_format"),QVariant(0)).toInt();
}

编写好C++的代码,接下来就要让用户界面可以使用这些方法进行设置的保存和获取。要使QML可以使用C++的方法,类需要继承QObject,方法需要是public的,并且使用Q_INVOKABLE标记,就像上面写的那样。接下来,在软件的main函数将C++的类注册到QML中。

int main(int argc, char *argv[])
{
    QScopedPointer<QGuiApplication> app(SailfishApp::application(argc,argv));
    QScopedPointer<QQuickView> view(SailfishApp::createView());
    qmlRegisterType<Settings>("abc.settings",1,0,"Settings");

    QObject::connect(view->engine(),SIGNAL(quit()),qApp,SLOT(quit()));

    view->setSource(SailfishApp::pathTo("qml/abc.qml"));
    view->show();
    return app->exec();
}

使用qmlRegisterType方法注册,第一个参数是在QML中import用到的名字,第二和第三个参数是版本号,第四个参数是QML中类的名字。写好这个部分,就可以在QML中使用这个类,创建一个对象了。

import QtQuick 2.2
import Sailfish.Silica 1.0
import abc.settings 1.0

Dialog {
    id: settingsDialog

    property int date_format: settings.get_date_format()

    ......

    onAccepted: {
        settings.set_date_format(date_format)
    }
}

这样就完成C++与QML的交互,实现用户界面保存和获取设置。

posted @ 2025-05-08 23:39  fishegg  阅读(122)  评论(0)    收藏  举报