How to remember last geometry of PyQt application?

前端 未结 4 1399
难免孤独
难免孤独 2020-12-18 11:26

I am using PyQt5 5.5.1 (64-bit) with Python 3.4.0 (64-bit) on Windows 8.1 64-bit.

I am having trouble restoring the position and size (geometry) of my very simple Py

相关标签:
4条回答
  • 2020-12-18 11:35

    You should indeed use QSetting for this.

    All the Qt examples have been converted to Python. They are included in the source packages of PyQt (or PySide), which you can download here

    You can also look online in the github repo, particularly in application.py of mainwindows example.

    def readSettings(self):
        settings = QSettings("Trolltech", "Application Example")
        pos = settings.value("pos", QPoint(200, 200))
        size = settings.value("size", QSize(400, 400))
        self.resize(size)
        self.move(pos)
    
    def writeSettings(self):
        settings = QSettings("Trolltech", "Application Example")
        settings.setValue("pos", self.pos())
        settings.setValue("size", self.size())
    

    Fire writeSettings() before quitting and initiate readSettings() on startup.

    0 讨论(0)
  • 2020-12-18 11:37

    In my case I use .ini files to store settings (language, default user, ...). the same code works on both Debian and Windows.

    An example:

    from PySide.QtCore import QSettings
    
    self.settings = QSettings('settings.ini', QSettings.IniFormat)
    ...
    self.settings.setValue('size', self.size())
    
    0 讨论(0)
  • 2020-12-18 11:40

    This should do.

    import sys
    from PyQt5.QtWidgets import QApplication, QWidget
    from PyQt5.QtCore import QSettings, QPoint, QSize
    
    class myApp(QWidget):
        def __init__(self):
            super(myApp, self).__init__()
    
            self.settings = QSettings( 'My company', 'myApp')     
    
            # Initial window size/pos last saved. Use default values for first time
            self.resize(self.settings.value("size", QSize(270, 225)))
            self.move(self.settings.value("pos", QPoint(50, 50)))
    
        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(sys.argv)
        frame = myApp()
        frame.show()
        app.exec_()
    

    I simplified this example: QSettings(): How to save to current working directory

    0 讨论(0)
  • 2020-12-18 11:46

    Similar to @Valentin's response, because I feel settings are being written to registry, which will be issue for cross compatiblity. Here is the relevant startEvent() and closeEvent() for the job.

    def startEvent()
        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", QSize(270, 225)))
        self.move(self.settings.value("pos", QPoint(50, 50)))
    
        self.tab = QWidget()
    
    def closeEvent(self, e):
        # Write window size and position to config file
        self.settings.setValue("size", self.size())
        self.settings.setValue("pos", self.pos())
    

    startEvent() should be initiated at startup and closeEvent() should be taken care before quitting the main window.

    0 讨论(0)
提交回复
热议问题