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