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
};
Vous devriez nous montrer la déclaration de 'File'. Est-ce qu'il obéit au modèle parent-enfant? – deepmax
@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
Le titre de ce sujet peut-il être amélioré? – drescherjm