用户对应用程序经常有这样的要求:要求它能记住它的settings,比如窗口大小,位置,一些别的设置,还有一个经常用的,就是recent files,等等这些都可以通过Qsettings来实现。
这些 settings一般都是存在系统里的,比如 windows一般都写在系统注册表或者写 INI文件,mac系统一般都在 XML文件里。而 Qsettings就是提供了一种方便的方法来存储和恢复应用程序的settings。
QSetting 来自PyQt5.QtCore模块,使用之前需导入该模块。当我们创建一个 Qsettings的对象时,我们需要传递给它两个参数,第一个是你公司或者组织的名称,第二个事你的应用程序的名称。比如:
Qsettings(“MS”,”MyApp”)
假如我们在应用程序中多次要用到Qsettings,为了简单起见,我们可以在主程序中先如下声明:
app.setOrganizationName("My organization") app.setOrganizationDomain("http://www.My-domain.cn") app.setApplicationName("myApp")
然后在应用程序的任何地方想要声明一个Qsettings类型的变量,便不需要书写两个参数了,直接用下面的语句就可以了:
settings = Qsettings()
保存设置用 settings.setValue(设置名 ,变量)即可。一般在通过在主窗口的closeEvent方法中保存 最终的setting。
settings = QSettings() settings.setValue("recentFiles",self.recentFiles) settings.setValue("MainWindowGeometry", self.saveGeometry())#保存主窗口尺寸和位置 #也可以self.size().self.pos()分别 返回尺寸和位置 以分开保存
#保存状态,如工具条的位置,停靠窗口的的位置和大小等 settings.setValue("MainWindowState", self.saveState())
恢复设置用 变量=settings.value(设置名)即可,一般写在初始化方法中。比如:
settings = QSettings() self.recentFiles = settings.value("recentFiles") or [] geometry = settings.value("MainWindowGeometry") if not ( geometry is None):#如果设置非空
self.restoreGeometry(geometry)#恢复主窗口尺寸和位置 state = settings.value("MainWindowState") if not (state is None): self.restoreState(state)#恢复状态,如工具条的位置,停靠窗口的的位置和大小等。
下面介绍recent file 列表的更新:
当用户保存文件时,就可以把当前文件名插入到最近文件列表的开头;一旦该列表长度超过上限,就删除最后一个文件:
if self.fileName not in self.recentFiles: self.recentFiles.insert(0,self.fileName) if len(self.recentFiles) > self.maxNumRecentFiles: self.recentFiles.pop()
有了最近文件列表,就可以动态的显示文件菜单。
首先,创建一系列文件相关动作和退出动作:
self.fileMenuActions = [self.fileNewAction,self.fileOpenAction,self.fileSaveAction,self.fileSaveAsAction] self.exitAction = self.createAction("E&xit",icon="",checkable=False, slot=self.close,tip="退出",shortcut=QKeySequence.Close)
接着,在创建文件菜单时只创建一个空的菜单,不添加任何动作,并将该菜单的aboutToShow 信号连接到 用于动态显示各文件相关动作的槽。aboutToShow信号在菜单被点击(或者用快捷键调用)时发射。在此之前,文件菜单里面的内容并不存在。
#文件菜单 self.fileMenu = self.menuBar().addMenu("&File") self.fileMenu.aboutToShow.connect(self.updateFileMenu)#动态显示菜单
然后,定义这个用于动态显示显示各文件相关动作的槽:
def updateFileMenu(self): self.fileMenu.clear() self.fileMenu.addActions(self.fileMenuActions) current = self.fileName recentFiles = [] for fname in self.recentFiles: if fname != current and QFile.exists(fname): recentFiles.append(fname) if recentFiles: self.fileMenu.addSeparator() for i ,fname in enumerate(recentFiles): action =self.createAction(fname,icon=None,checkable=False, slot=self.loadRecentFile,tip="recent file",shortcut=None) action.setData(fname)#保存数据到动作 self.fileMenu.addAction(action) self.fileMenu.addSeparator() self.fileMenu.addAction(self.exitAction)
最后,定义各最近文件动作的槽:
def loadRecentFile(self): sender = self.sender() if isinstance(sender,QAction): fname =sender.data()#取出动作保存的数据 if self.okToSaveChange(): self.load(fname)#加载文件
本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!