我有一个 QDialog,当用户关闭 QDialog 并稍后重新打开它时,我想记住位置并在完全相同的位置打开窗口。我怎么能准确地记住那个位置?
问问题
5889 次
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 回答