qt — указатели в QList

У меня есть класс под названием 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
};

0

Решение

Родитель указателей на 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 их здесь. Не трогай их.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]