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

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

1、QSettings配置文件的路径

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

#include 
 

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

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 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 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 

#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 
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
#include
#include
#include
#include 
struct Login {QString userName;QString password;};
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);QList logins;Login lg1[5];for(int i=0;i<5;i++){lg1[i].userName=QString("log%1").arg(i);lg1[i].password="000";logins<beginWriteArray("logins1");//写数组logins1for (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 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<endArray();//QString myfile="test.txt";//QSettings *settings=new QSettings(myfile,QSettings::IniFormat);settings->beginWriteArray("logins2");
//写数组logins2for (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()<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()<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()<beginWriteArray("maingroup");//for (int i = 5; i < logins2.size()+5; ++i) {settings->setValue("userName", "root");settings->setValue("password", "000");//}settings->endArray();qDebug()<value("maingroup/userName").toString();//列出maingroup下userName的值
}
MainWindow::~MainWindow()
{delete ui;
}
 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部