2012-07-05 108 views
2

我有一个QDialog,当用户关闭QDialog并稍后重新打开时,我想要记住位置并在同一个位置打开窗口。我将如何记住那个位置?PyQT窗口:我想记住它关闭的位置

+0

请看看[this](http://stackoverflow.com/questions/1538425/how-to-control-the-position-of-qdialog)问题。它看起来像标准的QT,而不是pyQT,但我想它会翻译。 – thegrinner 2012-07-05 20:37:49

回答

0

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

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

对于这一点,你可以使用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第2版。如果使用API​​ V1,你要的settings.value()结果手动施放为ByteArray像

self.restoreState(self.settings.value("windowState").toByteArray()) 

我还使用了窗口自身size()pos(),因为我已经从.ui文件加载的窗口。如果从头编码窗口,可以将它设置为默认值。对于状态,我默认为空字符串,该函数愉快地接受为空的ByteArray,并且在第一次运行时不做任何事情。

+0

自从self.settings.value(“geometry”)返回NoneType时,第一次尝试时不起作用。 – HansHarhoff 2015-11-25 18:03:26

+0

@HansHarhoff更改了默认情况下返回空字符串的示例,它修复了问题。 – 2016-09-05 03:47:00

2

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) 
+1

更改了默认情况下返回空字符串的示例,这样可以更彻底地修复问题,因为还原函数接受空字符串。这样我就不需要两次获取值。 – 2016-09-05 03:48:53