2013-10-01 2 views
0

J'ai une classe appelée File qui contient une QTextEdit* (une zone de texte), un QWidget* (utilisé pour créer des onglets dans un QTabWidget), un QString pour la tenue d'une adresse d'un fichier et un bool pour vérifier si le fichier a été enregistré/modifié. Je stocke ces fichiers dans un QList (c'est comme le std::list).C++ - pointeurs dans un QList

void MainWindow::newFile() 
{ 
    QWidget* tab = new QWidget(tabWidget); //QTabWidget is a member of MainWindow, it gets automatically deleted when MainWindow gets destryoed 
    tabWidget->addTab(tab, tr("New Tab")); //Add it to the QTabWidget 
    tab->setLayout(new QHBoxLayout(tab)); 

    QTextEdit* textEdit = new QTextEdit(tab); //When tab gets deleted, this also gets deleted 
    tab->layout()->addWidget(textEdit); 

    File *f = new File(this, textEdit, tab); //Store both in a file 
    fileList.push_back(f); //Add it to the list (member of MainWindow) 

    tabWidget->setCurrentIndex(tabWidget->count()-1); //Go to that tabPage 
    f->textEdit()->setFocus(); //Set the focus to the textEdit 
} 

Cela crée une nouvelle tabpage, ajoute à la QTabWidget, crée une mise en page pour TabPage, crée une nouvelle QTextEdit, ajoute à la mise en page de sorte qu'il est rempli et redimensionne automatiquement et finalement il est poussé en arrière sur le QList ainsi je peux enlever l'étiquette etc.

Puisque la classe File a des pointeurs comme membre leurs objets sur le tas doivent être supprimés. Mais quand j'essaye de les supprimer dans le destructeur, je reçois un SIGSEGV et mon programme plante.

File::~File() 
{ 
delete m_textEdit; //QTextEdit* - Crashes here 
delete m_tab; //QWidget* //Doesn't reach this line 
} 

Ma question est maintenant, pourquoi mon plantage du programme lorsque je tente de supprimer l » objet m_textEdit? Cela n'arrive que lorsque je ferme la fenêtre.

De plus, dois-je supprimer le fichier * lorsque je les supprime de la liste? Ou est-ce que la liste le fait automatiquement pour moi? Si oui, comment puis-je le faire?

//delete fileList.at(0); //This would cause a crash 
fileList.removeAt(0); //removing for example the first index 

Edit: Headerfile de File

class File : public QObject 
{ 
    Q_OBJECT 

    QTextEdit* m_textEdit; 
    QWidget* m_tab; 
    QString m_filepath; 
    bool m_saved; 

public: 
    explicit File(QObject *parent = 0); 
    File(const File&); 
    File(QObject* parent, QTextEdit* textEdit = 0, QWidget* tab = 0, const QString& filepath = QString(), bool saved = true); 
    ~File(); 

signals: 
    void savedChanges(bool); 

public slots: 
//Getters and setters only 
}; 
+0

Vous devriez nous montrer la déclaration de 'File'. Est-ce qu'il obéit au modèle parent-enfant? – deepmax

+0

@MM. Vous voulez dire l'en-tête, n'est-ce pas? Je l'ai posté. Et oui, si je ne me trompe pas c'est un schéma parent-enfant. – Davlog

+0

Le titre de ce sujet peut-il être amélioré? – drescherjm

Répondre

2

Le parent des pointeurs vers File est MainWindow donc en détruisant le parent ces objets seront détruits automatiquement, vous n'avez pas besoin de delete eux et cela est faux:

delete fileList.at(0); 

d'autre part, la suppression d'un élément de fileList ne blesse pas d il est OK:

fileList.removeAt(0); 

C'est le code n'a pas de sens:

File::~File() 
{ 
    delete m_textEdit; //QTextEdit* - Crashes here 
    delete m_tab; //QWidget* //Doesn't reach this line 
} 

Parce que, vous obtenez m_textEdit et m_tab du constructeur, et vous ne les avez pas new par File. Donc, ce n'est pas correct à delete ici. Ne les touche pas.

+0

Donc MainWindow gère les objets des membres m_textEdit et m_tab dans Fichier? – Davlog

+1

Lisez ici: http://qt-project.org/doc/qt-4.8/qobject.html#dtor.QObject – drescherjm

+0

@Davlog: Oui - si vous leur passez la main 'MainWindow'. – deepmax