¿Cómo limpiar adecuadamente un QWidget/administrar un conjunto de ventanas?
-
12-12-2019 - |
Pregunta
Digamos que tengo 2 ventanas en mi aplicación y dos clases responsables de ellas:class MainWindow: public QMainWindow
y class SomeDialog: public QWidget
.
En mi ventana principal tengo un botón.Cuando se hace clic en él, necesito mostrar la segunda ventana.Yo lo hago de esta manera:
SomeDialog * dlg = new SomeDialog();
dlg.show();
Ahora, el usuario hace algo en la ventana y la cierra.En este punto quiero obtener algunos datos de esa ventana y luego, supongo, tendré que delete dlg
.Pero, ¿cómo puedo detectar el evento de que se cierre esa ventana?
¿O hay otra manera de no tener una pérdida de memoria?Tal vez sería mejor crear una instancia de cada ventana al inicio y luego simplemente Show()
/Hide()
¿a ellos?
¿Cómo manejo un caso así?
Solución
Creo que estás buscando el indicador de ventana Qt::WA_DeleteOnClose: http://doc.qt.io/archives/qt-4.7/qt.html#WidgetAttribute-enum
QDialog *dialog = new QDialog(parent);
dialog->setAttribute(Qt::WA_DeleteOnClose)
// set content, do whatever...
dialog->open();
// safely forget about it, it will be destroyed either when parent is gone or when the user closes it.
Otros consejos
Se aconseja utilizar show()
/ exec()
y hide()
en lugar de crear dinámicamente el cuadro de diálogo cada vez que desee mostrarlo.También uso QDialog
en lugar de QWidget
.
En el constructor de tu ventana principal créalo y escóndelo.
MainWindow::MainWindow()
{
// myDialog is class member. No need to delete it in the destructor
// since Qt will handle its deletion when its parent (MainWindow)
// gets destroyed.
myDialog = new SomeDialog(this);
myDialog->hide();
// connect the accepted signal with a slot that will update values in main window
// when the user presses the Ok button of the dialog
connect (myDialog, SIGNAL(accepted()), this, SLOT(myDialogAccepted()));
// remaining constructor code
}
En la ranura conectada a los botones clicked()
evento simplemente muéstrelo y, si es necesario, pase algunos datos al cuadro de diálogo
void myClickedSlot()
{
myDialog->setData(data);
myDialog->show();
}
void myDialogAccepted()
{
// Get values from the dialog when it closes
}
Subclase de QWidget
y reimplementar
virtual void QWidget::closeEvent ( QCloseEvent * event )
http://doc.qt.io/qt-4.8/qwidget.html#closeEvent
También parece que el widget que desea mostrar es un cuadro de diálogo.Así que considere usar QDialog
o sus subclases. QDialog
tiene señales útiles a las que puedes conectarte:
void accepted ()
void finished ( int result )
void rejected ()