欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

QSetting 类使用

发布时间:2024/1/1 59 豆豆
生活随笔 收集整理的这篇文章主要介绍了 QSetting 类使用 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

QSetting是一个平台无关的可以设置和读取应用程序设置的类

用户可能希望应用程序记住自己应用程序的设置,windows记录在注册表中,mac中记录在xml中,在unix中,缺乏标准,所以很多都记录在.ini文本文件中

QSetting的API都是基于QVariant的,允许保存很多类型的数据,例如QString,QRect,和QImage

 

基本用法:

当创建一个QSetting对象时候,应该把公司或组织,还有应用程序的名字传递给构造函数,例如,如果应用程序叫做Star Runner,公司叫做MySoft,那么应该像下面这样构造对象

QSetting settings(“MySoft”,”Star Runner”);

QSetting的对象可以再堆或者栈上创建,构造和析构都非常快

如果在应用程序你在很多地方用QSetting,可以使用QCoreApplication::setOrganizationName()和QCoreApplication::setApplicationName()设置组织名和应用程序,然后使用QSetting的默认构造函数

QCoreApplication::setOrganizationName("MySoft");

     QCoreApplication::setOrganizationDomain("mysoft.com");

    QCoreApplication::setApplicationName("Star Runner");

     ...

     QSettings settings;

这里我们也指定了组织的网络域名,使用QCoreApplication::setOrganizationDomain()

 

QSetting有键和值组成,使用QString指定键key的名字,使用QVariant来存储和key相关联的值,设定key,使用setValue(),例如

Setting.setValue(“editor/warpMargin”,68);

如果已经存在了同名的key,那么新的值会覆盖原来的值

获取setting的值使用value()函数

Intmargin=setting.value(“editor/warpMargin”).toInt();

如果没有指定的key,那么value()会返回一个Null QVariant,也可以为value()指定一个缺省的值,如下面

Intmargin=setting.value(“editor/warpMargin,80).toInt();

缺省值就是80,value()返回的值是一个QVariant,把他转换成int类型

 

QVariant和GUI类型

因为QVariant是QtCore库的一部分,不能提供一个方便的函数转换成QColor,QImage和QPixmap,因为这些是QtGui的一部分,换句话说,没有toColor(),toImage(),toPixmap()等方法,但是我们可以使用qVariantValue()模板函数或者QVariant::value<templateT>来转换,他们是等价的,例如

QSettings settings("MySoft", "Star Runner"); QColor color = settings.value("DataPump/bgcolor").value<QColor>();

相反的转换过程是QVariant自动支持的,包括GUI相关类型,例如

QSettings settings("MySoft", "Star Runner"); QColor color = palette().background().color(); settings.setValue("DataPump/bgcolor", color);

 

QSetting语法

无论windows还是unix,使用“/”作为分隔符,而不是“\”,如果在一个地方指定了“text fonts”,就不要再其他地方指定“Text Fonts”,例如

     settings.setValue("mainwindow/size", win->size());      settings.setValue("mainwindow/fullScreen", win->isFullScreen());      settings.setValue("outputpanel/visible", panel->isVisible());

如果想设置子目录,也可以使用beginGroup()和endGroup()配合使用,如下

     settings.beginGroup("mainwindow");      settings.setValue("size", win->size());      settings.setValue("fullScreen", win->isFullScreen());      settings.endGroup();        settings.beginGroup("outputpanel");      settings.setValue("visible", panel->isVisible());      settings.endGroup();

效果和上面的一样

除了group之外,QSetting也支持array概念,详见beginReadArray()和beginWriteArray

如果有很多东西需要记录在setting中,可以使用arrays更简单一些,例如,你想保存一个变长的list,list中保存用户的name和password,可以用下面的代码

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();

得到的键如下

  • logins/size
  • logins/1/userName
  • logins/1/password
  • logins/2/userName
  • logins/2/password
  • logins/3/userName
  • logins/3/password

其中size是自动侦测到的长度

要想把他们读取出来,可以使用如下的方法

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();

 

例子,  保存GUI应用程序的状态

在关闭应用程序时候保存应用程序窗口的大小和位置,在再次打开应用程序时候,读取出来

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(); }

使用QWidget::resize()和QWidget::move()比QWidget::setGeometry()要更好

在构造函数中调用readSetting(),在关闭窗口事件中调用writeSettings()

MainWindow::MainWindow() {      ...      readSettings(); }   void MainWindow::closeEvent(QCloseEvent *event) {      if (userReallyWantsToQuit()) {          writeSettings();          event->accept();      } else {          event->ignore();      } }

 

在多线程和多进程中使用QSetting

QSetting是可重入的,意味着可以在不同的线程中使用不同的QSetting对象,这保证即便多个QSetting对象同时操作同一个文件或者磁盘,如果其中一个对象修改了文件或者注册表,同一个进程中其他操作同一个位置的QSetting对象能够检测到,并且不会读取到脏数据。

在不同的进程中使用QSetting来读写同一个setting文件是安全的,它使用文件锁和智能合并算法来保证数据的完整,在sync()调用之前,这个进程中的修改在另一个进程中是不可见的, QSetting::sync()的作用是将那些未保存的修改永久写进存储中,并且在其他进程中重新载入这些修改的设置,这个函数被QSetting的析构函数自动调用,也被事件循环定期调用,一般情况下不需要手动调用。

 

应用程序settings保存的位置

这里使用MySoft作为组织名,使用Star Runner作为应用程序名

在unix系统上,如果文件格式是NativeFormat,默认使用下面的文件

1 、$HOME/.config/MySoft/StarRunner.conf (Qt for Embedded Linux: $HOME/Settings/MySoft/Star Runner.conf)

2、$HOME/.config/MySoft.conf(Qt for Embedded Linux: $HOME/Settings/MySoft.conf)

3、/etc/xdg/MySoft/StarRunner.conf

4、/etc/xdg/MySoft.conf

 

Mac os x上,默认使用下面的文件

  • $HOME/Library/Preferences/com.MySoft.Star Runner.plist
  • $HOME/Library/Preferences/com.MySoft.plist
  • /Library/Preferences/com.MySoft.Star Runner.plist
  • /Library/Preferences/com.MySoft.plist
  • Windows上,NativeFormat设置被存储在下面路径的注册表中

  • HKEY_CURRENT_USER\Software\MySoft\Star Runner
  • HKEY_CURRENT_USER\Software\MySoft
  • HKEY_LOCAL_MACHINE\Software\MySoft\Star Runner
  • HKEY_LOCAL_MACHINE\Software\MySoft
  • 在windows上,32位程序运行在WOW64模式下,setting被存储在 HKEY_LOCAL_MACHINE\Software\WOW6432node.上

    如果是使用IniFormat,存储位置如下

    Mac OS X上

  • $HOME/.config/MySoft/Star Runner.ini (Qt for Embedded Linux: $HOME/Settings/MySoft/Star Runner.ini)
  • $HOME/.config/MySoft.ini (Qt for Embedded Linux: $HOME/Settings/MySoft.ini)
  • /etc/xdg/MySoft/Star Runner.ini
  • /etc/xdg/MySoft.ini
  • Windows上

  • %APPDATA%\MySoft\Star Runner.ini
  • %APPDATA%\MySoft.ini
  • %COMMON_APPDATA%\MySoft\Star Runner.ini
  • %COMMON_APPDATA%\MySoft.ini
  • %APPDATA%通常是 C:\Documents and Settings\User Name\ApplicationData;

    %COMMON_APPDATA% 通常是C:\Documents and Settings\All Users\Application Data

    .ini和.conf文件的路径可以使用setPath()来修改,在Mac OS X上,可以使用环境变量XDG_CONFIG_HOME

    直接读取INI和.plist文件

    在所有平台上,如果想直接读取ini文件,可以在QSetting的构造函数中,将ini文件的名和QSetting::IniFormat作为参数,如下

    QSettings settings("/home/petra/misc/myapp.ini",                     QSettings::IniFormat);

    然后可以使用settings对象来读写这些设置

    在Mac OS X上,读取XML基础文件.plist通过传递参数QSetting::NativaFormat作为第二个参数,例如

    QSettings settings("/Users/petra/misc/myapp.plist",                     QSettings::NativeFormat);

    直接读取Windows注册表

    通过传递给构造函数第二个参数QSetting::NativaFormat,第一个参数是注册表的键值位置,如下

    QSettings settings("HKEY_CURRENT_USER\\Software\\Microsoft\\Office",                     QSettings::NativeFormat);

    指定的路径下的所有注册表入口都可以通过QSetting像平常一样读写,例如

    settings.setValue("11.0/Outlook/Security/DontTrustInstalledFiles", 0);

    在windows上,一个键可能有一个值和一个子键,他默认的值可以通过“Dafault”和“.”获取

    settings.setValue("HKEY_CURRENT_USER\\MySoft\\Star Runner\\Galaxy", "Milkyway"); settings.setValue("HKEY_CURRENT_USER\\MySoft\\Star Runner\\Galaxy\\Sun", "OurStar"); settings.value("HKEY_CURRENT_USER\\MySoft\\Star Runner\\Galaxy\\Default"); // returns "Milkyway"

    在其他非windows平台上,“Default”和“.”将会被当做一般子键看待处理。

    总结

    以上是生活随笔为你收集整理的QSetting 类使用的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。