Распределение элементов в 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 является локальной переменной Он используется в качестве контейнера для передачи элементов в модель. После этого он не нужен и уничтожается, когда выходит за рамки. Тем не менее, элементы будут существовать до тех пор, пока не будут удалены из модели или модель не будет уничтожена.

1

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

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

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