QSettings操作配置文件及Qt获取系统相关位置
简述:用Qt编写界面时,你希望本地信息可保存,可以使用轻量级数据库sqlite,也可使用QSettings读写配置文件。QSettings类提供“持久性”、平台独立的应用程序设置,即程序关闭后QSettings把窗体大小,位置,用户设置的Option 保存起来,下次打开程序时再重新加载。
1、QSettings配置文件的路径
① QSettings配置文件的路径使用QStandardPaths获取系统目录。首先要引用头文件:
#include②然后通过以下语句获取不同的路径
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;};QListlogins;...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; }; QListlogins; ... 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; }
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
