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

时间:2012-07-05 20:33:14

标签: python pyqt

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

4 个答案:

答案 0 :(得分:7)

为此,您可以结合saveState()使用saveGeometry() closeEvent() resize()move()方法和其他答案中提到的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)

修改

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

self.restoreState(self.settings.value("windowState").toByteArray())

我还使用了自己的size()pos()窗口,因为我已经从.ui文件加载了窗口。如果从头开始编码窗口,您可以在这些行之前将其设置为默认值。对于州,我默认为一个空字符串,该函数很乐意接受为空的ByteArray,并且在第一次运行时什么都不做。

答案 1 :(得分:4)

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

AttributeError: 'NoneType' object has no attribute 'toByteArray'

这是因为首先没有保存的几何和状态。此外,返回值已经是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)

答案 2 :(得分:1)

看起来您可以使用QSettings。如果您查看标题为Restoring the State of a GUI Application的文档部分,您将找到主窗口的示例。

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

答案 3 :(得分:1)

您可以重新实现对话框的CloseEvent(在Qt文档中找到here),并使用QSettings(文档here)保存适当的设置。

class MyDialog(QDialog):
    def closeEvent(event):
        settings = QSettings()
        settings.setValue('value1', 1)
        event.accept()