我有一个QDialog,当用户关闭QDialog并稍后重新打开时,我想记住位置并在完全相同的位置打开窗口。我怎么能完全记住那个位置?
答案 0 :(得分:7)
为此,您可以结合saveState()
使用saveGeometry()
, closeEvent() resize()
和move()
方法和其他答案中提到的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,并且在第一次运行时什么都不做。
答案 1 :(得分:4)
RonanPaixã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)
答案 2 :(得分:1)
看起来您可以使用QSettings。如果您查看标题为Restoring the State of a GUI Application的文档部分,您将找到主窗口的示例。
换句话说,当用户关闭对话框时保存大小和位置,然后下次打开它时重新加载这些设置。
答案 3 :(得分:1)