2011-11-01 125 views
8

对于可以直接从闪存/笔/ usb/jump/thumb驱动器运行的应用程序,为了便于从一台机器移动到另一台机器,它对用户来说是有意义的要存储在记忆棒上的设置与运行程序的目录相同(而不是每台计算机的Windows/Mac/Linux用户或系统目录)。QSettings():如何保存到当前工作目录

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平台上运行:Ç :\ Documents and Settings \ All Users \ Application Data__MyBiz__settings.ini

UserScope而不是SystemScope没有帮助。
'.'而不是'./__settings.ini'没有工作,setPath()basicaly没有效果。
也试过这个无济于事:

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

有希望,虽然我不知道如何去适应Py​​Side:
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_() 

回答

8

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

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

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

+0

这很有效,谢谢。 – gseattle