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í?

¿Fue útil?

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 ()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top