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)