5

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

4

4 回答 4

10

为此,您可以使用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)

编辑:

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

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

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

于 2015-01-04T03:28:17.883 回答
6

Ronan Paixã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)
于 2015-11-25T18:09:33.977 回答
1

看起来您可以为此使用QSettings。如果您查看文档中标题为“恢复 GUI 应用程序的状态”的部分,您会发现一个主窗口的示例。

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

于 2012-07-05T20:44:54.280 回答
1

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

class MyDialog(QDialog):
    def closeEvent(event):
        settings = QSettings()
        settings.setValue('value1', 1)
        event.accept()
于 2012-07-05T20:50:25.353 回答