简述:用Qt编写界面时,你希望本地信息可保存,可以使用轻量级数据库sqlite,也可使用QSettings读写配置文件。QSettings类提供“持久性”、平台独立的应用程序设置,即程序关闭后QSettings把窗体大小,位置,用户设置的Option 保存起来,下次打开程序时再重新加载。
1、QSettings配置文件的路径
① QSettings配置文件的路径使用QStandardPaths获取系统目录。首先要引用头文件:
#include <QDesktopServices>②然后通过以下语句获取不同的路径
static QString writableLocation(StandardLocation type);③也可以通过以下语句获取路径下的文件和文件夹
static QStringList standardLocations(StandardLocation type);④参数为路径名字的指代值,列表如下:
QStandardPaths::DesktopLocation 0 Returns the user's desktop directory. QStandardPaths::DocumentsLocation 1 Returns the user's document. QStandardPaths::FontsLocation 2 Returns the user's fonts. QStandardPaths::ApplicationsLocation 3 Returns the user's applications. QStandardPaths::MusicLocation 4 Returns the user's music. QStandardPaths::MoviesLocation 5 Returns the user's movies. QStandardPaths::PicturesLocation 6 Returns the user's pictures. QStandardPaths::TempLocation 7 Returns the system's temporary directory. QStandardPaths::HomeLocation 8 Returns the user's home directory. QStandardPaths::DataLocation 9 Returns 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::CacheLocation 10 Returns a directory location where user-specific non-essential (cached) data should be written. QStandardPaths::GenericCacheLocation 15 Returns a directory location where user-specific non-essential (cached) data, shared across applications, should be written. QStandardPaths::GenericDataLocation 11 Returns a directory location where persistent data shared across applications can be stored. QStandardPaths::RuntimeLocation 12 Returns a directory location where runtime communication files should be written. For instance unix local sockets. QStandardPaths::ConfigLocation 13 Returns a directory location where user-specific configuration files should be written. QStandardPaths::DownloadLocation 14 Returns 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中,NativeFormat和IniFormat意思是一样的,只是文件扩展名不同(NativeFormat为.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; }