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

  • 本文关键字:位置 窗口 PyQT python pyqt
  • 更新时间 :
  • 英文 :


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

为此,您可以使用 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()pos(),因为我已经在从.ui文件加载窗口。如果从头开始编码窗口,则可以将其设置为这些行之前的默认值。对于状态,我默认为一个空字符串,该函数愉快地接受它作为空 ByteArray 并且在第一次运行时不执行任何操作。

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)

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

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

看起来你可以为此使用 QSettings。如果您查看文档中标题为"还原 GUI 应用程序的状态"的部分,您将找到一个主窗口的示例。

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

_windowStatesEnum = {
    0x00000000 : Qt.WindowNoState,          #       The window has no state set (in normal state).
    0x00000001 : Qt.WindowMinimized,        #       The window is minimized (i.e. iconified).
    0x00000002 : Qt.WindowMaximized,          #      The window is maximized with a frame around it.
    0x00000004 : Qt.WindowFullScreen,         #      The window fills the entire screen without any frame around it.
    0x00000008 : Qt.WindowActive,             # The window is the active window, i.e. it has keyboard focus.        
}
    
def __setstate__(self, data):
    self.__init__()
    self.setGeometry(data['geometry'])
    self.setWindowState(self._windowStatesEnum[data['window state']])
    
def __getstate__(self):
    return {
        'geometry' : self.geometry(),
        'window state' : int(self.windowState()),
    }    

最新更新