Delete avec Qt

Résolu
twiiiix Messages postés 325 Date d'inscription   Statut Membre Dernière intervention   -  
twiiiix Messages postés 325 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Je programme avec Qt, et j'ai du mal à savoir quand il faut désallouer un objet alloué dynamiquement. Quelqu'un peut-il me dire dans quel cas Qt désalloue automatiquement et dans quel cas il ne le fait pas. Si par exemple dans mon fichier Header je déclare un pointer sur un objet et que je l'initialise dans une méthode, l'objet sera-t-il désallouer si j'appelle
la méthode plusieurs fois ?



Merci d'avance.


2 réponses

loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention   148
 
La réponse est simple:
- le mécanisme de Qt est tel que lorsqu'un objet Qt est détruit tous ses enfants sont automatiquement détruits.
Lorsque l'on crée un widget X (par exemple un QDialog) et qu'à l'intérieur de celui-ci on crée des QLabel, des QTextEdit, des QWidget... qui ont tous pour parents ou grands-parents le fameux X, alors suite à l'appel de 'close()', X sera détruit ainsi que tous ses enfants et petits-enfants.
Sauf cas particuliers on ne détruit pas implicitement de widget.
Toutefois ceci ne s'applique qu'aux widgets de Qt; pour les autres objets les principes du C++ s'appliquent.
Bonne continuation.
4
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
quelle famille cruelle ! Mais que fait la police ?
Merci pour ces précisions loupius. Une dernière précision, delete agit donc comme close() ?
QWidget *a;
a=new...
...
delete a;
// équivaut à
a->close();
0
francis
 
Ce serai plutot close() qui appelle les delete...
0
twiiiix Messages postés 325 Date d'inscription   Statut Membre Dernière intervention   57
 
OK, merci beaucoup, donc comme mon programme ne possède qu'une seule fenêtre qui hérite de QMainWindow, tout les objet alloué dans son constructeur serons détruit.

Juste une dernière question, lorsque j' ai besoin d'un nouvel objet dans une méthode, faut-il que je déclare son pointeur dans le H et que je l'initialise dans la méthode ou que je le crée tout simplement, si j'utilise la première solution sera-t-il désallouer automatiquement ?
0
twiiiix Messages postés 325 Date d'inscription   Statut Membre Dernière intervention   57
 
Je n'est pas de close() dans mon programme, est-ce grave, est-elle appeler automatiquement à la fermeture de la fenêtre ?
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Rien compris, c'est quoi "H" ?
j'imagine que tu doit avoir :
QWidget::close()
{...
   delete this;
}

et
QWidget::~QWidget{
...
   close();
}
0
loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention   148
 
Ouhh la la je ne pensais pas engendrer tant d'interrogation !!!
Voici un exemple minimal qui met en lumière ce qui est et ce qui n'est pas détruit automatiquement par Qt, enfin j'espère (je ne mets que le code):
class FenPrincipale : public QMainWindow 
{ 
  Q_OBJECT 
  public: 
    FenPrincipale(QWidget* parent=0); 
    ~FenPrincipale(); 
  private: 
    int entier; 
    int* pentier; 
    QString fileName; 
    QLabel* label; 
    QLineEdit* lineEdit; 
    QPushButton* pushButton; 
}; 

FenPrincipale::FenPrincipale(QWidget *parent) : QMainWindow(parent) 
{ 
  entier = 100; 
  pentier = new int; 
  label = new QLabel("Exemple", this); 
  label->setGeometry(10,10,100,25); 
  lineEdit = new QLineEdit(this); 
  lineEdit->setGeometry(10,40,100,25); 
  pushButton = new QPushButton("close", this); 
  pushButton->setGeometry(10,70,100,25); 
  QObject::connect(pushButton, SIGNAL(clicked()), this, SLOT(close())); 
} 

FenPrincipale::~FenPrincipale() 
{ 
  delete pentier; 
} 

int main(int argc, char* argv[]) 
{ 
  QApplication app(argc, argv); 
  FenPrincipale fenetre; 
  fenetre.show(); 
  return app.exec(); 
}
Nota: 'close()' est une fonction (en fait un slot) défini pour tout objet dérivant de QWidget.
Bonne réflexion et si vous avez des questions...
1
twiiiix Messages postés 325 Date d'inscription   Statut Membre Dernière intervention   57
 
Encore une fois merci ; )
close() est donc similaire à quit() .
0
twiiiix Messages postés 325 Date d'inscription   Statut Membre Dernière intervention   57
 
Au fait, encore une question ^^, c'est un bout du code d'un de mes slot :

for(i= 0 ; i<hauteur ; i++)   
    { 
        for(y= 0 ; y<7 ; y++) 
        { 
            temp = new QTableWidgetItem ; 
            text->setNum(tableauDonnee[i][y],'f',0);   
            temp->setText(*text ); 
            table->setItem(i,y,temp);   
        } 
    }

hauteur est déclaré dans le constructeur, text est aussi déclaré dans le constructeur(QString), table est aussi déclaré dans le constructeur (QTableWidget).
tableauDonnee fait la même taille que table, il est désalloué à la fin du slot car il n'est plus utile. Ce slot est appelé beaucoup de fois dans mon programme.
Les QTableWidgetItem seront-il désallouer à un moment donné ?
0
loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention   148
 
'close' et 'quit' pas tout à fait identiques.
'quit' termine l'application et 'close' ne fait que fermer un widget. Toutefois, dans l'exemple donné, 'close' a le même effet que 'quit' puisqu'une fois la fenêtre fermée, la main est redonnée au 'main' et l'appli est terminée.
0
loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention   148
 
Oui les 'QTableWidgetItem seront désalloués au moment de la destruction de 'table' puisqu'en invoquant la fonction 'setItem', implicitement on donne 'table' comme parent de 'temp'.
Il est toutefois possible de récupérer ce QTableWidgetItem en l'enlevant de QTableWidget, par exemple avec la méthode 'takeItem', et dans ce cas il appartient au programmeur de gérer cet objet en le détruisant s'il n'en a plus besoin car le fait de le récupérer a supprimé la filiation (ce qui est fort logique).
Bonne réflexion.
0
twiiiix Messages postés 325 Date d'inscription   Statut Membre Dernière intervention   57
 
Merci : )
Mais, est-ce que la méthode setItem détruit l'ancien QTableWidgetItem qui était dans table ? car le slot est appelé beaucoup de fois, sinon dois-je rajouter un :

delete table[i][y] ;
avant d'appeler setItem ?
0