1

Maya 2015 用に多くの PySide スクリプトを作成し、.xml を使用して設定を保存しますQSettings。通常QSettings、「readSettings」および「writeSettings」関数でオブジェクトを作成します。今日はQSettingsオブジェクトをクラス変数にしてみました。しかし、それはいくつかの奇妙な効果を引き起こしました。通常は として返される特定の値が として返されるよう<type 'unicode'>になりまし<type 'bool'>たが、常にではありません!

問題を説明するために私が書いたテスト スクリプトを次に示します。

import shiboken

from PySide import QtGui, QtCore
from maya import OpenMayaUI

#------------------------------------------------------------------------------
def getMayaMainWindow():
    parentWindow = OpenMayaUI.MQtUtil.mainWindow()
    if parentWindow:
        return shiboken.wrapInstance(long(parentWindow), QtGui.QWidget)

#------------------------------------------------------------------------------
class TestQSettingsWin(QtGui.QMainWindow):
    def __init__(self, parent=getMayaMainWindow()):
        super(TestQSettingsWin, self).__init__(parent)

        self.setWindowTitle('Test QSettings')
        self.setObjectName('testAllMMessagesWindow')

        self.centralWidget = QtGui.QWidget()
        self.setCentralWidget(self.centralWidget)
        self.mainLayout = QtGui.QVBoxLayout(self.centralWidget)
        self.checkBox = QtGui.QCheckBox('check box')
        self.mainLayout.addWidget(self.checkBox)

        self.readSettings()

    def closeEvent(self, event):
        self.writeSettings()

    def getQSettingsLocation(self):
        raise NotImplementedError('Subclasses of TestQSettingsWin need to '
                                  'implement "getQSettingsLocation"".')

    def readSettings(self):
        setting = self.getQSettingsLocation()
        self.restoreGeometry(setting.value('geometry'))
        self.restoreState(setting.value('windowState'))
        print type(setting.value('checkBox'))

    def writeSettings(self):
        setting = self.getQSettingsLocation()
        setting.setValue('geometry', self.saveGeometry())
        setting.setValue('windowState', self.saveState())
        setting.setValue('checkBox', self.checkBox.isChecked())

#------------------------------------------------------------------------------
class TestQSettingsClassVar(TestQSettingsWin):
    savedSettings = QtCore.QSettings(QtCore.QSettings.IniFormat,
                                     QtCore.QSettings.UserScope,
                                     "Test",
                                     "TestQSettings1")
    def getQSettingsLocation(self):
        return self.savedSettings

#------------------------------------------------------------------------------
class TestQSettingsDefScope(TestQSettingsWin):
    def getQSettingsLocation(self):
        setting = QtCore.QSettings(QtCore.QSettings.IniFormat,
                                   QtCore.QSettings.UserScope,
                                   "Test",
                                   "TestQSettings3")
        return setting

#------------------------------------------------------------------------------
def showTestWindows():
    test1 = TestQSettingsClassVar()
    test1.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
    test1.show()
    test2 = TestQSettingsDefScope()
    test2.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
    test2.show()

インタラクティブ セッションで実行した結果は次のとおりです。

>>> import testQSettings
>>> testQSettings.showTestWindows()
<type 'NoneType'>
<type 'NoneType'>
>>> testQSettings.showTestWindows()
<type 'bool'>
<type 'unicode'>
>>> testQSettings.showTestWindows()
<type 'bool'>
<type 'unicode'>
>>> reload(testQSettings)
# Result: <module 'testQSettings' from 'C:/Users/becca/Documents/maya/2015-x64/scripts\testQSettings.pyc'> # 
>>> testQSettings.showTestWindows()
<type 'unicode'>
<type 'unicode'>
>>> testQSettings.showTestWindows()
<type 'bool'>
<type 'unicode'>
>>> testQSettings.showTestWindows()
<type 'bool'>
<type 'unicode'>

ご覧のとおり、QSettings必要なときにいつでもオブジェクトを作成すると、一貫<type 'unicode'>してデータ値の結果が返されます。ただし、QSettingsオブジェクトをクラス変数として作成すると、モジュールが再ロードされた場合を除い<type 'bool'>て結果が返され、 .<type 'unicode'>

誰でもこの奇妙な動作を説明できますか? QSettingsオブジェクトをクラス変数にしてはいけないという規則はありますか?

4

1 に答える 1

1

設定オブジェクトは、ディスクに書き込む前に、さまざまな種類の値をバイトにシリアル化する必要があります。これは通常、設定オブジェクトが削除されたときに行われます (または、イベント ループが実行されている場合は、保存されていないデータが定期的にディスクにフラッシュされる場合があります)。

保存されていないデータがディスクにフラッシュされていないときは常に、 を呼び出すたびにsettings.value()シリアル化されていない値が元の型で返されます。

を呼び出して自分でデータを強制的にフラッシュすることは可能かもしれませんがsettings.sync()、これを試みないことを強くお勧めします。QSettings値を読み書きするときは常に新しいオブジェクトを作成し、使用後は必ず削除する必要があります。一貫性を保証するには、これで十分です。

于 2015-02-20T00:15:13.040 に答える