>我有一个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()),
}