PyQT窗口:我想记住它关闭的位置

use*_*315 4 python pyqt

我有一个QDialog,当用户关闭QDialog,并在以后重新打开它时,我想记住位置并在完全相同的位置打开窗口.我怎么会记得那个位置?

Ron*_*xão 8

为此,你可以使用saveState(),saveGeometry() resize()move()方法,结合其他答案提到的closeEvent()QSettings.这是一个例子,以获得这个想法:

class MyWindow(QMainWindow):
    def __init__(self, parent):
        QMainWindow.__init__(self, parent)
        self.settings = QSettings("MyCompany", "MyApp")
        self.restoreGeometry(self.settings.value("geometry", ""))
        self.restoreState(self.settings.value("windowState", ""))

    def closeEvent(self, event):
        self.settings.setValue("geometry", self.saveGeometry())
        self.settings.setValue("windowState", self.saveState())
        QMainWindow.closeEvent(self, event)
Run Code Online (Sandbox Code Playgroud)

编辑:

更新了使用PyQt API v2的答案.如果使用API​​ v1,则必须手动将结果settings.value()转换为ByteArray

self.restoreState(self.settings.value("windowState").toByteArray())
Run Code Online (Sandbox Code Playgroud)

我还使用了窗口的自己size()pos(),因为我已经从一个在载入Windows .ui文件.如果从头开始编码窗口,您可以在这些行之前将其设置为默认值.对于状态,我默认为一个空字符串,该函数愉快地接受为空ByteArray并且在第一次运行时不执行任何操作.


Han*_*off 6

RonanPaixão的答案几乎是正确的。尝试执行此操作时出现错误:

AttributeError: 'NoneType' object has no attribute 'toByteArray'
Run Code Online (Sandbox Code Playgroud)

这是因为,起初没有保存的几何图形和状态。此外,返回值已经是QByteArray。该代码对我有用:

class MyWindow(QMainWindow):
    def __init__(self, parent):
        QMainWindow.__init__(self, parent)
        self.settings = QSettings("MyCompany", "MyApp")
        if not self.settings.value("geometry") == None:
            self.restoreGeometry(self.settings.value("geometry"))
        if not self.settings.value("windowState") == None:
            self.restoreState(self.settings.value("windowState"))
    def closeEvent(self, event):
        self.settings.setValue("geometry", self.saveGeometry())
        self.settings.setValue("windowState", self.saveState())
        QMainWindow.closeEvent(self, event)
Run Code Online (Sandbox Code Playgroud)


the*_*ner 1

看来您可以使用QSettings来实现此目的。如果您查看标题为“恢复 GUI 应用程序的状态”的文档部分,您将找到主窗口的示例。

换句话说,当用户关闭对话框时保存大小和位置,然后下次打开对话框时重新加载这些设置。