QSettings():如何保存到当前工作目录

Posted

技术标签:

【中文标题】QSettings():如何保存到当前工作目录【英文标题】:QSettings(): How to save to current working directory 【发布时间】:2011-11-01 03:53:14 【问题描述】:

对于可以直接从闪存/笔/USB/跳转/拇指驱动器运行的应用程序,为了从一台机器移动到另一台机器的便携性,将用户设置存储在相同的记忆棒上是有意义的运行程序的目录(而不是 Windows/Mac/Linux 用户或每台机器的系统目录)。

QSettings() 很方便,但是可以告诉它使用当前工作目录吗?

这是一个使用 QSettings() 保持其屏幕位置从运行到运行的小示例程序:

from PySide import QtGui, QtCore
from PySide.QtGui import QTabWidget, QApplication
from PySide.QtCore import QSettings

class AbcApp(QTabWidget):
    def __init__(self):
        super(AbcApp, self).__init__()

        self.settings = QSettings(QSettings.IniFormat,QSettings.SystemScope, '__MyBiz', '__settings')
        self.settings.setFallbacksEnabled(False)    # File only, not registry or or.

        # setPath() to try to save to current working directory
        self.settings.setPath(QSettings.IniFormat,QSettings.SystemScope, './__settings.ini')

        # Initial window size/pos last saved
        self.resize(self.settings.value("size", QtCore.QSize(270, 225)))
        self.move(self.settings.value("pos", QtCore.QPoint(50, 50)))

        self.tab = QtGui.QWidget()
        self.textEdit = QtGui.QTextEdit(self.tab)
        self.textEdit.sethtml('<font color=grey>[QTextEdit area]</font><p><center><font color=blue size=4><b>Allo Woyld</b></font></center>')
        self.addTab(self.tab, 'tab1')

    def closeEvent(self, e):
        # Write window size and position to config file
        self.settings.setValue("size", self.size())
        self.settings.setValue("pos", self.pos())

        e.accept()

if __name__ == '__main__':
    app = QApplication('')
    frame = AbcApp()
    frame.show()
    app.exec_()

这个 .ini 文件是因为我目前恰好在 Windows 上运行而创建的:C:\Documents and Settings\All Users\Application Data__MyBiz__settings.ini

UserScope 代替 SystemScope 没有帮助。'.' 代替 './__settings.ini' 不起作用,setPath() 基本上没有效果。 也试过这个无济于事:

filepath = os.getcwd() + '/__settings.ini'
self.settings.setPath(QSettings.IniFormat,QSettings.SystemScope, filepath)

参考:https://doc.qt.io/archives/qt-4.8/qsettings.html http://www.pyside.org/docs/pyside/PySide/QtCore/QSettings.html

有希望,虽然我不知道如何适应 PySide:http://www.qtcentre.org/archive/index.php/t-35287.html


更新:来自 alexisdm 的答案有效,所以现在是更新的代码:

from PySide import QtGui, QtCore
from PySide.QtGui import QTabWidget, QApplication
from PySide.QtCore import QSettings

class AbcApp(QTabWidget):
    def __init__(self):
        super(AbcApp, self).__init__()

        self.settings = QSettings('settings.ini', QSettings.IniFormat)
        self.settings.setFallbacksEnabled(False)    # File only, no fallback to registry or or.

        # Initial window size/pos last saved if available
        self.resize(self.settings.value('size', QtCore.QSize(270, 225)))
        self.move(self.settings.value('pos', QtCore.QPoint(50, 50)))

        self.tab = QtGui.QWidget()
        self.textEdit = QtGui.QTextEdit(self.tab)
        self.textEdit.setHtml('<font color=grey>[QTextEdit area]</font><p><center><font color=blue size=4><b>Allo Woyld</b></font></center>')
        self.addTab(self.tab, 'tab1')

    def closeEvent(self, e):
        self.settings.setValue('size', self.size())
        self.settings.setValue('pos', self.pos())
        e.accept()

if __name__ == '__main__':
    app = QApplication('')
    frame = AbcApp()
    frame.show()
    app.exec_()

【问题讨论】:

【参考方案1】:

您可以像这样使用 class QSettings(fileName, format[, parent=None]) 的重载:

self.settings = QSettings("__settings.ini", QSettings.IniFormat)

如果路径是相对的,则该文件已经在当前工作目录中打开,但这可能不是您想要的。 您可以尝试these answers 之一来使用脚本所在的目录。

【讨论】:

以上是关于QSettings():如何保存到当前工作目录的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 QSettings 保存和加载数据?

如何将所选项目从 QListWidget、QTableWidget 保存到 Qsettings

R语言如何更改工作目录??

如何使用 QSettings 将 QString 添加到注册表

保存应用程序设置(QSettings)

Python:为啥 Python 会停止保存在当前工作目录中