Question

Disons que j'ai 2 fenêtres dans mon application et deux classes qui en sont responsables :class MainWindow: public QMainWindow et class SomeDialog: public QWidget.

Dans ma fenêtre principale, j'ai un bouton.Lorsqu'on clique dessus, je dois afficher la deuxième fenêtre.Je procède de cette façon :

SomeDialog * dlg = new SomeDialog();
dlg.show();

Maintenant, l'utilisateur fait quelque chose dans la fenêtre et la ferme.À ce stade, je souhaite récupérer des données de cette fenêtre, puis, je suppose, je devrai delete dlg.Mais comment puis-je détecter l'événement de fermeture de cette fenêtre ?

Ou existe-t-il un autre moyen de ne pas avoir de fuite de mémoire ?Il serait peut-être préférable de créer une instance de chaque fenêtre au démarrage, puis de simplement Show()/Hide() eux?

Comment gérer un tel cas ?

Était-ce utile?

La solution

Je pense que vous recherchez l'indicateur de fenêtre 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.

Autres conseils

Il est conseillé d'utiliser show() / exec() et hide() au lieu de créer dynamiquement la boîte de dialogue à chaque fois que vous souhaitez l'afficher.Utiliser aussi QDialog au lieu de QWidget.

Dans le constructeur de votre fenêtre principale, créez-le et cachez-le

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
}

Dans l'emplacement relié aux boutons clicked() l'événement affiche-le simplement et, si nécessaire, transmets certaines données à la boîte de dialogue

void myClickedSlot()
{
    myDialog->setData(data);
    myDialog->show();
}

void myDialogAccepted()
{
    // Get values from the dialog when it closes
}

Sous-classe de QWidget et réimplémenter

virtual void QWidget::closeEvent ( QCloseEvent * event )

http://doc.qt.io/qt-4.8/qwidget.html#closeEvent

Il semble également que le widget que vous souhaitez afficher soit une boîte de dialogue.Pensez donc à utiliser QDialog ou ce sont des sous-classes. QDialog a des signaux utiles auxquels vous pouvez vous connecter :

void    accepted ()
void    finished ( int result )
void    rejected ()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top