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
オブジェクトをクラス変数にしてはいけないという規則はありますか?