打开QDialog并保存上次状态

时间:2016-05-20 12:30:59

标签: python pyqt qdialog

我正在尝试从QDialog打开一个QMainWindow,关闭`QDialog后,如果我需要再次打开它,它必须打开并显示相同的信息。关闭它。

以下是QMainWindow的代码:

class A (QMainWindow):
  def __init__(self):
    QMainWindow.__init__(self)

    #I create a QPushButton to open the QDialog
    self.axes1 = self.figure_canvas.figure.add_axes ([0.8, 0.01, 0.19, 0.05])
    self.button = QPushButton(self.axes1,"Open Dialog")
    self.button.on_clicked(self.OpenDialog)

    #This is the method to open the QDialog which is in another module
  def OpenDialog(self, event):
    text = configurePort.ConfigurePort.retrieve_data(self)
    print text

此代码的作用是在我的QMainWindow中创建一个按钮,当我单击它时,它会打开一个QDialog,它在另一个模块中创建。这是QDialog

的代码
class ConfigurePort(QDialog):
  def __init__(self, parent = None):
     QDialog.__init__(self, parent)
     uic.loadUi("configurePort.ui", self)

    #I create a button to check active ports and show them
    self.connect(self.btn_checkconn, SIGNAL("clicked()"), self.check_ports)

    #This method calls another class which opens another QDialog
    #and I select the port that I want
  def check_ports(self):
     self.check_serial = CheckPorts(self)
     self.check_serial.exec_()

    #After selecting the port, when I close the QDialog of the class named above
    #the port´s name appears in the first QDialog
  @classmethod
  def retrieve_data(cls, parent = None):
     dlg = cls(parent)
     dlg.exec_()
     text = dlg.getPortText()
     return text

  def closeEvent(self, event):
     #Here is where I need to write the code to close the QDialog 
     #and it does not has to be an event

在方法closeEvent中,我需要编写必要的代码,因此我可以关闭窗口,并使用我用来打开它的相同按钮,再次打开它,显示它显示的最后一个信息当我关闭它时。

我曾尝试使用QSettings但它没有用(也许我用错了)。我也尝试了show()的{​​{1}}和hide()类,但它没有用。希望你能帮帮我。

-----编辑-----

我编辑了上面的代码。我添加了一些方法来更好地理解。所以,我打开名为PyQt的{​​{1}},它显示了这个:

enter image description here

红色圆圈围绕着港口的名称。它显示在QDialog中,我从ConfigurePort获取此文本,然后在关闭QLabel时将其打印出来。由于我之前提出的一个问题,我在这个链接中表达了这一点:

Getting data from child using PyQt

上面代码中显示的QDialog方法会打开另一个效果很好的QDialog。有了这个,我可以在我的电脑中选择我需要的端口。所以,这没关系。

因此,在关闭check_port(并选择例如“COM3”,如图中所示)之后,我需要再次打开它,并查看关闭它之前显示的相同信息

我尝试使用QDialog添加此行:

QDialog

但正如我之前所说,我认为我没有正确使用它,但我希望我能用更简单的方法解决这个问题。

-----编辑2 -----

感谢@Brendan Abel的帮助我有这段代码:

QSettings

这给了我这个错误:self.settings = QSettings("MyCompany", "MyApp") if not self.settings.value("windowsState") == None: self.restoreState(self.settings.value("windowState")) 我知道我错过了一些东西,但我看不到它。

2 个答案:

答案 0 :(得分:2)

您可以通过多种方式保留此数据通常,要在会话中保留数据,请使用__init__并加载closeEvent中的数据并将其保存在v2方法中

通常它看起来像这样。这也假设您使用QVariant api的QSettings.value版本;否则,从QVariant返回的结果将是PyQt,您需要将其转换为适当的python类型。如果您使用的是v2的最新版本,那么您应该在import sip sip.setapi('QVariant', 2) sip.setapi('QString', 2) class MyDialog(QDialog): def __init__(self, parent): super(MyDialog, self).__init__(parent) self.myvalue = 10 self.restoreSettings() def closeEvent(self, event): self.saveSettings() super(MyDialog, self).closeEvent(event) def saveSettings(self): settings = QSettings('myorg', 'myapp') settings.setValue('myvalue', self.myvalue) def restoreSettings(self): settings = QSettings('myorg', 'myapp') self.myvalue = settings.value('myvalue', self.myvalue) but if not you can force it上,将其粘贴在文件的顶部

self.buttonBox.button(QDialogButtonBox.Ok).clicked.connect(self.closeEvent)

编辑:

代码中的错误是由此引起的:

closeEvent

您不应直接致电或连接.close。相反,您应该连接到.acceptself.buttonBox.button(QDialogButtonBox.Ok).clicked.connect(self.accept)

{{1}}

答案 1 :(得分:1)

您需要实例化ConfigurePort类,然后self.configurePortDialog对象应保持一致。您需要确保是否让用户输入取消不存储数据的数据以及“确定”存储数据的数据,但我不确定您在对话框中放置了什么。

class A (QMainWindow):
  def __init__(self):
    QMainWindow.__init__(self)

    #I create a QPushButton to open the QDialog
    self.button = QPushButton("Open Dialog")
    self.button.on_clicked(self.OpenDialog)
    self.configurePortDialog = configurePort.ConfigurePort(parent=self)
    self.configurePortDialog.accepted.connect(self.get_data)

    #This is the method to open the QDialog which is in another module
  def OpenDialog(self, event):
     self.configurePortDialog.show()

  @QtCore.Slot()
  def get_data(self)
    text = self.configurePortDialog.retrieve_data()
    print text