-
-
Save bootchk/5330231 to your computer and use it in GitHub Desktop.
''' | |
Copyright 2013 Lloyd Konneker | |
License: LGPL | |
''' | |
from PySide.QtCore import QSettings | |
class WindowSettable(object): | |
''' | |
Mixin behavior for MainWindow: window attributes persist as Settings | |
See Qt Application Example, where these are called readSettings() and writeSettings(). | |
Assert that QSettings have been established on app startup: | |
QCoreApplication.setOrganizationName("Foo") | |
QCoreApplication.setOrganizationDomain("foo.com") | |
QCoreApplication.setApplicationName("Bar") | |
''' | |
def _readAndApplyWindowAttributeSettings(self): | |
''' | |
Read window attributes from settings, | |
using current attributes as defaults (if settings not exist.) | |
Called at QMainWindow initialization, before show(). | |
''' | |
qsettings = QSettings() | |
qsettings.beginGroup( "mainWindow" ) | |
# No need for toPoint, etc. : PySide converts types | |
self.restoreGeometry(qsettings.value( "geometry", self.saveGeometry())) | |
self.restoreState(qsettings.value( "saveState", self.saveState())) | |
self.move(qsettings.value( "pos", self.pos())) | |
self.resize(qsettings.value( "size", self.size())) | |
if qsettings.value( "maximized", self.isMaximized()) : | |
self.showMaximized() | |
qsettings.endGroup() | |
def _writeWindowAttributeSettings(self): | |
''' | |
Save window attributes as settings. | |
Called when window moved, resized, or closed. | |
''' | |
qsettings = QSettings() | |
qsettings.beginGroup( "mainWindow" ) | |
qsettings.setValue( "geometry", self.saveGeometry() ) | |
qsettings.setValue( "saveState", self.saveState() ) | |
qsettings.setValue( "maximized", self.isMaximized() ) | |
if not self.isMaximized() == True : | |
qsettings.setValue( "pos", self.pos() ) | |
qsettings.setValue( "size", self.size() ) | |
qsettings.endGroup() |
note: qsettings.value( "maximized") read as a lowercase false string for me which registered as true for the if statement.
My way around this was:
def str2bool(self, strBool):
if type(strBool) == type(True):
return strBool
return strBool.lower() in ("yes", "true", "t", "1")
...
maximized = qsettings.value("maximized", self.isMaximized())
# apply settings
self.restoreGeometry(qsettings.value("geometry", self.saveGeometry()))
self.restoreState(qsettings.value("saveState", self.saveState()))
self.move(qsettings.value( "pos", self.pos()))
self.resize(qsettings.value( "size", self.size()))
if self.str2bool(maximized) :
self.showMaximized()
....
Here's my iteration, for the sake of knowledge and anyone who was having a bunch of trouble with maximizing.
def _writeWindowAttributeSettings(self):
'''
Save window attributes as settings.
Called when window moved, resized, or closed.
'''
self.settings.beginGroup("mainWindow")
self.settings.setValue("pos", self.MainWindow.pos())
self.settings.setValue("maximized", self.MainWindow.isMaximized())
if not self.MainWindow.isMaximized():
self.settings.setValue("size", self.MainWindow.size())
self.settings.endGroup()
def _readAndApplyWindowAttributeSettings(self):
'''
Read window attributes from settings,
using current attributes as defaults (if settings not exist.)
Called at QMainWindow initialization, before show().
'''
self.settings.beginGroup("mainWindow")
# No need for toPoint, etc. : PySide converts types
try:
self.MainWindow.move(self.settings.value("pos"))
if self.settings.value("maximized") in 'true':
self.MainWindow.showMaximized()
else:
self.MainWindow.resize(self.settings.value("size"))
except:
pass
self.settings.endGroup()
You'll notice I'm using self.MainWindow
. change that as necessary for your code
It's worth mentioning that this all needs to happen after the widgets have been made. Obvious in hindsight; not so clear when trying to debug. Thanks @bootchk for putting all this info in one spot.
FWIW, here's where in the docs this stuff is mentioned: https://doc.qt.io/qtforpython-5/PySide2/QtCore/QSettings.html?highlight=qsettings#restoring-the-state-of-a-gui-application
Is this code snippet portable
if qsettings.value( "maximized", self.isMaximized()):
?pyside/PySide#124 (comment)