Как я могу удалить эти динамически размещенные объекты, когда их контейнер разрушен? - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть QList указателей на QStandardItems, которые я добавляю к QStandardItemModel, который используется для QTableView.Я хочу, чтобы QStandardItems и MODDataFile были удалены при уничтожении fileListView.Каков наилучший способ добиться этого?

foreach (QString fileName, fileList)
{
    MODDataFile *file = new MODDataFile(dir.filePath(fileName)); 
    QList<QStandardItem*> row;

    QStandardItem *item = new QStandardItem();
    item->setData(QVariant::fromValue(file));
    row.append(item);

    row.append(new QStandardItem(file->mUserInfo["TestID"])); 
    row.append(new QStandardItem(fileName));
    row.append(new QStandardItem(file->mTimeAndLocation["Date"]));

    mFileModel.appendRow(row);
}

ui->fileListView->setModel(&mFileModel);

Я пытался просто использовать объекты QStandardItem вместо указателей, но QStandardItemModel :: appendRow () занимает QList<QStandardItem*>.file является указателем, потому что это большие классы, и я хочу передать их другим классам.

1 Ответ

0 голосов
/ 18 декабря 2018

Вы можете заменить эти строки кода:

MODDataFile *file = new MODDataFile(dir.filePath(fileName)); 
QList<QStandardItem*> row;

QStandardItem *item = new QStandardItem();
item->setData(QVariant::fromValue(file));
row.append( item );

row.append(new QStandardItem(file->mUserInfo["TestID"])); 
row.append(new QStandardItem(fileName));
row.append(new QStandardItem(file->mTimeAndLocation["Date"]));

mFileModel.appendRow(row);

на:

std::shared_ptr<MODDataFile> file = std::make_shared<MODDataFile>();
QList<std::shared_ptr<QStarndardItem>> row;

std::shared_ptr<QStandardItem> item = std::make_shared<QStandardItem>();
item->setData(QVariant::fromValue(file));
row.append( item );

row.append( std::shared_ptr<QStandardItem>( new QStandardItem( file->mUserInfo["TestID"])));
row.append( std::shared_ptr<QStandardItem>( new QStandardItem(filename));
row.append( std::shared_ptr<QStandardItem>( new QStandardItem(file->mTimeAndLocation["Data"])));

mFileModel.appendRow(row);

Использование shared_ptr или unique_ptr очистит вашу памятьили когда вы вызываете релиз на них, или они выходят за рамки.Когда они выйдут из области видимости, их деструкторы очистят всю память и подсчет ссылок для вас.Это также зависит от того, что является mFileModel, и как вы проектировали свою модель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...