QSettings操作配置文件及Qt获取系统相关位置

52 篇文章 5 订阅

简述:用Qt编写界面时,你希望本地信息可保存,可以使用轻量级数据库sqlite,也可使用QSettings读写配置文件。QSettings类提供“持久性”、平台独立的应用程序设置,即程序关闭后QSettings把窗体大小,位置,用户设置的Option 保存起来,下次打开程序时再重新加载。

1、QSettings配置文件的路径

① QSettings配置文件的路径使用QStandardPaths获取系统目录。首先要引用头文件:

#include <QDesktopServices>
 

②然后通过以下语句获取不同的路径

static QString writableLocation(StandardLocation type);
 

③也可以通过以下语句获取路径下的文件和文件夹

static QStringList standardLocations(StandardLocation type);
 

④参数为路径名字的指代值,列表如下

QStandardPaths::DesktopLocation0Returns the user's desktop directory.
QStandardPaths::DocumentsLocation1Returns the user's document.
QStandardPaths::FontsLocation2Returns the user's fonts.
QStandardPaths::ApplicationsLocation3Returns the user's applications.
QStandardPaths::MusicLocation4Returns the user's music.
QStandardPaths::MoviesLocation5Returns the user's movies.
QStandardPaths::PicturesLocation6Returns the user's pictures.
QStandardPaths::TempLocation7Returns the system's temporary directory.
QStandardPaths::HomeLocation8Returns the user's home directory.
QStandardPaths::DataLocation9Returns a directory location where persistent application data can be 
stored. QCoreApplication::organizationName and
QCoreApplication::applicationName are appended to the directory location returned for GenericDataLocation.
QStandardPaths::CacheLocation10Returns a directory location where user-specific non-essential (cached) data should be written.
QStandardPaths::GenericCacheLocation15Returns a directory location where user-specific non-essential (cached) data, shared across applications, should be written.
QStandardPaths::GenericDataLocation11Returns a directory location where persistent data shared across applications can be stored.
QStandardPaths::RuntimeLocation12Returns a directory location where runtime communication files should be written. For instance unix local sockets.
QStandardPaths::ConfigLocation13Returns a directory location where user-specific configuration files should be written.
QStandardPaths::DownloadLocation14Returns a directory for user's downloaded files.

2、创建QSettings对象

① QSettings的API是基于 Qvariant,它包含了大部分通常的 Qt 数据类型,比如QString,QRec,QImage,等等。

②当创建一个Qsettings的对象时,需要传递给它两个参数,第一个是组织的名称,第二个是应用程序的名称。比如:

m_settings = Qsettings(“ MySoft”,” QtPad”)
公司名称:MySoft,程序名称:QtPad

③假如在应用程序中多次要用到Qsettings,可以在主程序中先如下声明,这样,组织名及应用程序名只要指定一次。

    QApplication::setOrganizationName("MySoft");
    QApplication::setOrganizationDomain("mysoft.com");
    QApplication::setApplicationName("QtPad");

④然后在应用程序的任何地方想要声明一个Qsettings类型的变量,直接用m_settings = QSettings即可。

3、QSettings::Format

常量描述
QSettings::NativeFormat      使用平台最合适的存储格式设置。
在Windows中,使用系统注册表;

OS X和iOS中,使用的是CFPreferences API;
在Unix中,使用的是INI格式的文本配置文件
QSettings::IniFormat    1存储在INI文件中的设置。
QSettings::InvalidFormat   16 registerFormat()返回的值

Unix中,NativeFor​​mat和IniFormat意思是一样的,只是文件扩展名不同(NativeFor​​mat为.conf,IniFormat 为.ini)

4、QSettings读写value

QSettings存储了一对键值( Key / value ) ,Key 是一个QString,Value是一个QVariant。

 
 
m_settings.setValue(“pos”,QVariant(Mainwindow.pos());
    m_settings.setValue(“size”,QVariant(Mainwindow.size());

添加键值的时候,如果Key已存在,则Value被重写。

② 读取QSettings的内容

    Pos = m_settings.value(“pos”).toPoint();
    Size = m_settings.value(“size”).toSize();

若key所对应的value是int型的,也可toInt(),若没有要找的key,则会返回一个nullQVariant 如果用toInt的话会得到0。

③ 实际应用如下:

    pos = m_settings.value("pos", QVariant(QPoint(200,200))).toPoint();
    size = m_settings.value("size", QVariant(QSize(400,400))).toSize();
    self.resize(size);
    self.move(pos);
 

注意:因为QVariant是不会提供所有数据类型的转化的,比如有toInt(),toPoint(),toSize(),但却没有对QcolorQimageQpixmap等数据类型的转化,此时可以QVariant.value()

5、QSettings 其他常用函数

函数说明
QStringList allKeys() const
返回所有的key,以list形式
 
QString applicationName() const
返回应用程序名称
 
QString fileName() const
返回写入注册表地址,或ini文件路径
 
void beginGroup(const QString &prefix)
自动添加group到指定的key
 
void endGroup()
恢复group为在调用beginGroup之前的group
 
int beginReadArray(const QString &prefix);
向当前组添加前缀并从数组开始读取。返回数组的大小。
 
void beginWriteArray(const QString &prefix, int size = -1);
向当前组添加前缀并开始编写大小大小的数组。如果大小为-1(默认值),则根据条目的索引自动确定。
 
void remove(const QString &key);
清除key及其所对应的value
 

① :

② :

③ :

④ :

⑤ 遍历分组:

Example:
 struct Login {
     QString userName;
     QString password;
 };
 QList<Login> logins;
 ...
 QSettings settings;
 int size = settings.beginReadArray("logins");
 for (int i = 0; i < size; ++i) {
     settings.setArrayIndex(i);
     Login login;
     login.userName = settings.value("userName").toString();
     login.password = settings.value("password").toString();
     logins.append(login);
 }
 settings.endArray();
 

⑥ 添加分组,并链表化,读写分组:

struct Login{
    QString userName;
    QString password;
};
QList<Login> logins;
...
QSettings settings;
settings.beginWriteArray("logins");
for (int i = 0; i < logins.size(); ++i) {
    settings.setArrayIndex(i);
    settings.setValue("userName", list.at(i).userName);
    settings.setValue("password", list.at(i).password);
}
settings.endArray();

输出:

⑦ :

⑧ :

⑨ :

//  readSettings()  /writeSettings()
 void MainWindow::writeSettings()
 {
    QSettings settings("Moose Soft", "Clipper");
    settings.beginGroup("MainWindow");
    settings.setValue("size", size());
    settings.setValue("pos", pos());
    settings.endGroup();
 }
 void MainWindow::readSettings()
 {
    QSettings settings("Moose Soft", "Clipper");
    settings.beginGroup("MainWindow");
    resize(settings.value("size", QSize(400, 400)).toSize());
    move(settings.value("pos", QPoint(200, 200)).toPoint());
    settings.endGroup();
 }
// readSettings() and writeSettings() 必须分别位于主窗体的构造函数和closeEvent函数里面。
 MainWindow::MainWindow()
 {
    ...
    readSettings();
 }
 void MainWindow::closeEvent(QCloseEvent*event)
 {
    if (userReallyWantsToQuit()) {
        writeSettings();
        event->accept();
    } else {
        event->ignore();
    }
 }
 

6、例子


main.cpp
#include 
<QtGui/QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QApplication::setOrganizationName("MySoft");
    QApplication::setOrganizationDomain("mysoft.com");
    QApplication::setApplicationName("QtPad");
    MainWindow w;
    w.show();
    return a.exec();
}
mainwindow.h
#ifndef 
MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QList>
#include<QSettings>
#include<QFile>
#include<QStringList>
#include<QDebug>
#include <QDesktopServices>
struct Login {
     QString userName;
     QString password;
 };
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QList<Login> logins;
    Login lg1[5];
    for(int i=0;i<5;i++){
        lg1[i].userName=QString("log%1").arg(i);
        lg1[i].password="000";
        logins<<lg1[i];
    }
    QString myfile= QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + "/Settings.ini";
    QSettings *settings=new QSettings(myfile,QSettings::IniFormat);
    settings->beginWriteArray("logins1");//写数组logins1
    for (int i = 0; i < logins.size(); ++i) {
        settings->setArrayIndex(i);
        settings->setValue("userName", logins.at(i).userName);
        settings->setValue("password", logins.at(i).password);
    }
    QList<Login> logins2;
    Login lg2[5];
    for(int i=0;i<5;i++){
        lg2[i].userName=QString("log%1").arg(i+5);
        lg2[i].password="000";
        logins2<<lg2[i];
    }
      settings->endArray();
    //QString myfile="test.txt";
    //QSettings *settings=new QSettings(myfile,QSettings::IniFormat);
    settings->beginWriteArray("logins2");
//写数组logins2
    for (int i = 5; i < logins2.size()+5; ++i) {
        settings->setArrayIndex(i);
        settings->setValue("userName", logins2.at(i-5).userName);
        settings->setValue("password", logins2.at(i-5).password);
    }
     settings->endArray();
      QStringList groups = settings->childGroups();
      foreach(QString str,groups)//列出所有子组
      qDebug()<<str;
        //QSettings
      int size = settings->beginReadArray("logins1");
      for (int i = 0; i < size; ++i) {
          settings->setArrayIndex(i);
          Login login;
          login.userName = settings->value("userName").toString();
          login.password = settings->value("password").toString();
          logins.append(login);
      }
      settings->endArray();
      qDebug()<<logins.size();
      for(int i=0;i<logins.size();i++)
      {
          qDebug()<<i<<logins[i].userName;
      }
      size = settings->beginReadArray("logins2");
      for (int i = 0; i < size; ++i) {
          settings->setArrayIndex(i);
          Login login;
          login.userName = settings->value("userName").toString();
          login.password = settings->value("password").toString();
          logins.append(login);
      }
      settings->endArray();
      qDebug()<<logins.size();
      for(int i=0;i<logins.size();i++)
      {
          qDebug()<<i<<logins[i].userName;
      }
      settings->beginWriteArray("maingroup");
      //for (int i = 5; i < logins2.size()+5; ++i) {
      settings->setValue("userName", "root");
      settings->setValue("password", "000");
      //}
       settings->endArray();
       qDebug()<<settings->value("maingroup/userName").toString();//列出maingroup下userName的值
}
MainWindow::~MainWindow()
{
    delete ui;
}
 

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt可以通过QSettings类来读取配置文件。QSettings是一个用于访问和修改应用程序设置和配置的类。它可以读取和写入INI文件格式和注册表格式的配置信息。 首先,需要包含QSettings头文件,并在需要的地方创建QSettings对象。在创建对象时,可以指定配置文件的路径和格式。通常,可以使用应用程序的配置文件来保存配置信息。 接下来,可以使用QSettings的value()函数读取配置项的值。该函数接受一个字符串参数,表示要获取的配置项的键名,可以使用点分隔符来访问多级配置项。value()函数返回一个QVariant类型的值,可以通过toXXX()函数将其转换为相应的类型,如QString、int、bool等。 如果需要读取整个配置文件的内容,可以使用allKeys()函数获取所有配置项的键名列表,然后遍历列表,逐个读取配置项的值。 在读取配置文件之前,需要确保配置文件存在,可以使用QFile类的exists()函数来判断文件是否存在。 读取配置文件之后,可以根据需要使用配置项的值来进行相应的操作,如在界面中显示配置项的值,设置应用程序的选项等。 最后,使用完配置文件后,需要手动释放QSettings对象,可以使用delete关键字来销毁对象,以释放资源。 综上所述,通过QSettings类,可以方便地读取和管理配置文件中的配置信息。具体的实现方法可以根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值