Распределение элементов в QStandardItemModel

Когда QStandardItemModel, который расположен в стеке, уничтожается, что происходит с объектами, на которые указывают указатели в модели (например, item/item2 указатель как в следующем примере):

QStandardItem* item = new QStandardItem("test");
QStandardItem* item2 = new QStandardItem("test2");

QList<QStandardItem*> list;
list.append(item);
list.append(item2);

QStandardItemModel model;
model.addRow(list);

В этом контексте, если я правильно понял, строка в модели состоит из N значений, каждое значение в этой строке представлено как QStandardItem, Это означает, что вышеприведенный объект "список" представляет собой одну строку с двумя значениями (столбцами).

Это лучше или хуже, чем при использовании model.setData(), model.setRowCount() а вручную отслеживать координаты?

Если нужен полный контекст, он здесь. Идея состоит в том, чтобы вручную зациклить QSqlQuery результаты и получить строки в кусках. Соответствующий метод называется loadChunk,

Если модель размещена в стеке, нужно ли мне каким-то образом управлять освобождением элементов, загруженных в модель через addRow()

TLDR; Как убедиться, что модель не пропускает память, когда модель выделяется из стека, но содержит много указателей на объекты в куче?

1 ответ

Решение

Примечание: это QStandardItemModel::appendRowне QStandardItemModel::addRow,

Теперь к теме:

Вам не нужно беспокоиться об уничтожении объектов QStandardItem вручную. Когда модель, к которой они принадлежат, разрушается, они тоже.

Чтобы продемонстрировать это наследование от QStandardItem и поместить отладочное сообщение в деструктор следующим образом:

MyItem.h

#ifndef MYITEM_H
#define MYITEM_H

#include <QStandardItem>

class MyItem : public QStandardItem
{
public:
    explicit MyItem(const QString &text);
    ~MyItem();
};

#endif // MYITEM_H

MyItem.cpp

#include "MyItem.h"

MyItem::MyItem(const QString &text) :
    QStandardItem(text)
{

}

MyItem::~MyItem()
{
    qDebug("Gone");
}

mainwindow.cpp

#include "MainWindow.h"
#include "MyItem.h"
#include <QStandardItemModel>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    QStandardItemModel model;
    auto *item = new MyItem("test");

    model.appendRow(item);
}

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

auto *model = new QStandardItemModel(this);
model->appendRow(item);
model->deleteLater();

В любом случае приложение должно вывести "Gone" сразу после запуска.

Кстати, результат будет таким же при использовании model->removeRow(model->rowCount() - 1); вместо model->deleteLater();,

Для QList<QStandardItem*> list; в вашем коде, list является локальной переменной Он используется в качестве контейнера для передачи элементов в модель. После этого он не нужен и уничтожается, когда выходит за рамки. Тем не менее, элементы будут существовать до тех пор, пока не будут удалены из модели или модель не будет уничтожена.

Другие вопросы по тегам