QSettings操作配置文件及Qt获取系统相关位置
2017-03-29 12:00
1001 查看
简述:用Qt编写界面时,你希望本地信息可保存,可以使用轻量级数据库sqlite,也可使用QSettings读写配置文件。QSettings类提供“持久性”、平台独立的应用程序设置,即程序关闭后QSettings把窗体大小,位置,用户设置的Option 保存起来,下次打开程序时再重新加载。
②然后通过以下语句获取不同的路径
③也可以通过以下语句获取路径下的文件和文件夹
④参数为路径名字的指代值,列表如下:
②当创建一个Qsettings的对象时,需要传递给它两个参数,第一个是组织的名称,第二个是应用程序的名称。比如:
m_settings = Qsettings(“MySoft”,”QtPad”)
公司名称:MySoft,程序名称:QtPad
③假如在应用程序中多次要用到Qsettings,可以在主程序中先如下声明,这样,组织名及应用程序名只要指定一次。
④然后在应用程序的任何地方想要声明一个Qsettings类型的变量,直接用m_settings
= QSettings即可。
Unix中,NativeFormat和IniFormat意思是一样的,只是文件扩展名不同(NativeFormat为.conf,IniFormat
为.ini)
Key / value ) ,Key 是一个QString,Value是一个QVariant。
添加键值的时候,如果Key已存在,则Value被重写。
② 读取QSettings的内容
若key所对应的value是int型的,也可toInt(),若没有要找的key,则会返回一个nullQVariant 如果用toInt的话会得到0。
③ 实际应用如下:
注意:因为QVariant是不会提供所有数据类型的转化的,比如有toInt(),toPoint(),toSize(),但却没有对Qcolor,Qimage和Qpixmap等数据类型的转化,此时可以用QVariant.value();
① :
② :
③ :
④ :
⑤ 遍历分组:
⑥ 添加分组,并链表化,读写分组:
输出:
⑦ :
⑧ :
⑨ :
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()返回的值 |
为.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; }
相关文章推荐
- Qt获取系统相关位置路径
- Qt获取系统相关位置
- Qt获取系统相关位置
- Qt获取系统相关位置
- 应用程序试图执行安全策略不允许的操作。要授予此应用程序所需的权限,请与系统管理员联系,或在配置文件中更改该应用程序的信任级别
- andoird 系统之SharedPreferences(配置文件)操作
- 磁盘、文件系统相关操作
- 应用程序试图执行安全策略不允许的操作。要授予此应用程序所需的权限,请与系统管理员联系,或在配置文件中更改该应用程序的信任级别。
- IOS文件系统及其相关操作(NSFileManager,NSFileHandle)
- iphone ios 文件系统操作(创建、删除,修改,获取属性)
- Qt学习之路_8(Qt中与文件目录相关操作)
- iphone开发--获取系统配置文件内容
- andoird 系统之SharedPreferences(配置文件)操作
- 文件系统及相关操作
- Mysql:命令选项、配置选项、(全局、会话)系统变量、状态变量:和路径、文件名称相关的设置
- 根文件系统中相关配置文件的介绍
- iphone开发--获取系统配置文件内容
- QT 使用QSettings 读写ini配置文件
- hadoop配置文件详解、安装及相关操作
- 获取linux的文件系统相关信息的知识点