setstandardbuttons qmessage functions python pyqt qdialog

python - qmessage - Abrir un QDialog y guardar el último estado



setstandardbuttons pyqt (2)

Necesita crear una instancia de la clase ConfigurePort y luego el objeto self.configurePortDialog debe mantenerse constante. Tendrá que asegurarse de que si el usuario ingresa datos, una cancelación no almacena los datos y que un "ok" almacena los datos, pero no estoy seguro de lo que está poniendo en su diálogo.

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

Estoy tratando de abrir un QDialog desde QMainWindow , y después de cerrar el `QDialog, si necesito abrirlo nuevamente, debe abrirse y mostrar la misma información que cuando lo cerré.

Aquí está el código de 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

Lo que hace este código es crear un botón en mi QMainWindow y cuando hago clic en él, abre un QDialog , que se crea en otro módulo. Y este es el código del 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

En el método, closeEvent , necesito escribir el código necesario, así que puedo cerrar la ventana, y usando el mismo botón que utilizo para abrirlo, abrirlo nuevamente con la última información que mostró cuando lo cerré.

Intenté usar QSettings pero no funcionó (tal vez lo usé mal). Y probé también las clases show() y hide() de PyQt , pero no funcionó. Espero que puedas ayudarme.

----- EDIT -----

Edité el código de arriba. y agregué algunos métodos para una mejor comprensión. Entonces, abro el QDialog llamado ConfigurePort y muestra esto:

El círculo rojo, rodea el nombre del puerto. Se muestra en QLabel , tomo este texto del QDialog y luego lo QDialog cuando cierro el QDialog . Lo hago gracias a una pregunta que hice antes, que se encuentra en este enlace:

Obteniendo datos del niño usando PyQt

El método check_port que se muestra en el código anterior abre otro QDialog que funciona muy bien. Con esto puedo seleccionar los puertos que necesito en mi pc. Entonces, esto no importa.

Entonces, después de cerrar el QDialog (y seleccionar, por ejemplo, "COM3", como puede ver en la imagen), necesito abrirlo nuevamente, y ver la misma información que se mostró antes de cerrarla.

Intenté agregar estas líneas, usando QSettings :

self.settings = QSettings("MyCompany", "MyApp") if not self.settings.value("windowsState") == None: self.restoreState(self.settings.value("windowState"))

Pero como dije antes, creo que no lo usé bien, pero espero que resuelva esto usando algo más simple.

----- EDIT 2 -----

Gracias a la ayuda de @Brendan Abel tengo este código:

class ConfigurePort(QDialog): def __init__(self, parent): super(ConfigurePort, self).__init__(parent) uic.loadUi("configurePort.ui", self) self.myValue = 10 self.restoreSettings() self.connect(self.btn_checkconn, SIGNAL("clicked()"), self.check_ports) self.buttonBox.button(QDialogButtonBox.Cancel).clicked.connect(self.close) self.buttonBox.button(QDialogButtonBox.Ok).clicked.connect(self.closeEvent) self.iniUi() def check_ports(self): pass def iniUi(self): pass #I just create some QLabels in here @classmethod def retrieve_data(cls, parent = None): dlg = cls(parent) dlg.exec_() text = dlg.getPortText() return text def closeEvent(self, event): self.saveSettings() super(QDialog,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)

Esto me da este error: TypeError: QWidget.closeEvent(QCloseEvent): argument 1 has unexpected type ''bool'' Sé que me falta algo, pero no puedo verlo.


Hay QSettings formas en que puede conservar estos datos. Generalmente, para conservar los datos en todas las sesiones, usa QSettings y carga los datos en __init__ y guárdelos en el método closeEvent

En general, se ve algo como esto. Esto también asume que usa la versión v2 de la API QVariant ; de lo contrario, los resultados devueltos por QSettings.value serán un QVariant y deberá convertirlo al tipo de python apropiado. Si está utilizando una versión reciente de PyQt entonces debería estar en la v2 , pero si no, puede forzarlo pegando esto en la parte superior de su archivo

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)

EDITAR:

El error en tu código es causado por esto:

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

No debe llamar ni conectarse a closeEvent directamente. En su lugar, debe conectarse a .close o .accept

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