您的位置:首页 > 编程语言 > Qt开发

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

2017-03-29 12:00 1001 查看
简述:用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     0  使用平台最合适的存储格式设置。
在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(),但却没有对Qcolor,Qimage和Qpixmap等数据类型的转化,此时可以用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息