在通常情况下,用户使用一个软件的时候,期望保存一些数据状态,比如窗口的大小和位置,主题,选项,最近操作过的文件等等信息,在下一次启动软件的时候就自动加载这些信息,让软件恢复到上一次退出时的状态。在Windows系统中,这些信息通常存储在系统注册表中,在macOS和iOS则存储在属性列表中。在Unix系统上,在没有标准情况下,许多应用都使用INI文件来保存配置信息。 QSettings就是围绕不同的系统做了技术上的抽象,使开发者可以轻松实现在不同系统间可移植的方式来保存和恢复应用程序设置。同时QSetting还可以支持自定义存储格式来保存和恢复应用程序的设置。
QSettings简介
QSettings类提供一种与平台无关的应用程序设置的保存和恢复技术。可以用下面的方式创建QSettings对象。
方式一: 传递给QSettings两个参数,第一个为公司或者组织的名称(如MySoft),第二个是应用程序的名称(如 MyProgram),创建一个QSettings对象:
self.settings = QSettings('MySoft', 'MyProgram')
说明,在Windows下同下,这种方式信息写在注册表中。
方式二:指定配置文件名和配置文件格式的方式来创建,如下面的语句将以ini文件的格式创建一个名为config.ini的配置信息文件:
self.settings = QSettings('config.ini', QSettings.IniFormat)
使用函数setValue()来存储数据,如果已经存在相同的键值,那么新设置的值将覆盖就的设置值。为了保证效率,所做的更改有可能不会马上存储到文件中,使用sync()函数可以保证设置同步存储到文件中。函数 value()返回存储的键值。
键(key)可以包含任何Unicode字符。Windows注册表和INI文件使用不区分大小写的键,而macOS和iOS上的CFPreferences API使用不区分大小写的键。为避免可移植性问题,请遵循以下简单规则:
- 始终使用相同的大小写引用相同的键。例如,如果在代码中的某个地方将键称为“text fonts”,则不要在其他地方将使用“Text Fonts”来引用。
- 除大小写外,请避免使用相同的键名。例如,如果您有一个名为“ MainWindow”的键,请不要尝试将另一个键另存为“ mainwindow”。
- 在节或键名中不要使用斜杠(“ /”和“ ”);反斜杠字符用于分隔子键。在Windows上,QSettings将“ ”转换为“ /”,从而使它们相同。
可以使用'/'字符作为分隔符来形成分层键,类似于Unix文件路径。例如:
self.settings.setValue("mainwindow/size", self.win.size()self.settings.setValue("mainwindow/fullScreen", self.win.isFullScreen()self.settings.setValue("outputpanel/visible", self.panel.isVisible()
如果要保存或者读取很多具有相同分组的设置,则可以使用beginGroup()指定分组前缀,并在最后调用endGroup()。使用分组机制,演示上面的示例代码如下:
self.settings.beginGroup("mainwindow");self.settings.setValue("size", self.win->size())self.settings.setValue("fullScreen", self.win.isFullScreen())self.settings.endGroup(); self.settings.beginGroup("outputpanel");self.settings.setValue("visible", self.panel.isVisible())self.settings.endGroup()
演示
在前面notepay.py的基础上,添加了三个函数initRecentFile(), updateRecentFileMneu() 和updateRecentFiles(),演示了使用QSettings