У меня есть класс под названием File
который содержит QTextEdit*
(текстовое поле), QWidget*
(используется для создания вкладок в QTabWidget
), QString
для хранения адреса файла и bool
проверить, был ли файл сохранен / изменен.
Я храню эти файлы в QList
(это так же, как std::list
).
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
}
Это создает новую вкладку, добавляет ее к QTabWidget
создает макет для вкладки, создает новый QTextEdit
, добавляет его к макету, чтобы он был заполнен и автоматически изменит размер, и, наконец, он будет перенесен на QList
так что я могу удалить вкладку и т. д.
Так как класс File
имеет указатели в качестве члена их объекты в куче должны быть удалены. Но когда я пытаюсь удалить их в деструкторе, я получаю SIGSEGV, и моя программа падает.
File::~File()
{
delete m_textEdit; //QTextEdit* - Crashes here
delete m_tab; //QWidget* //Doesn't reach this line
}
Мой вопрос сейчас, почему моя программа падает, когда я пытаюсь удалить m_textEdit
объект? Это происходит только когда я закрываю окно.
Кроме того, я должен удалить Файл *, когда я удаляю их из списка? Или список делает это автоматически для меня? Если да, то как мне это сделать?
//delete fileList.at(0); //This would cause a crash
fileList.removeAt( 0 ); //removing for example the first index
Изменить: заголовочный файл 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
};
Родитель указателей на File
является MainWindow
поэтому, уничтожив родительский объект, эти объекты будут уничтожены автоматически, тогда вам не нужно delete
их и это не правильно
delete fileList.at(0);
С другой стороны, удаление элемента из fileList
не больно и все нормально
fileList.removeAt(0);
Этот код не имеет смысла:
File::~File()
{
delete m_textEdit; //QTextEdit* - Crashes here
delete m_tab; //QWidget* //Doesn't reach this line
}
Потому что вы получаете m_textEdit
а также m_tab
от конструктора, а вы этого не сделали new
их File
, Так что это не правильно delete
их здесь. Не трогай их.
Других решений пока нет …