我有一个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)
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并且在第一次运行时不执行任何操作.
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)
看来您可以使用QSettings来实现此目的。如果您查看标题为“恢复 GUI 应用程序的状态”的文档部分,您将找到主窗口的示例。
换句话说,当用户关闭对话框时保存大小和位置,然后下次打开对话框时重新加载这些设置。