QStandardItemModel 中项目的重新分配

Deallocation of items in 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。这意味着上面的 "list" 对象是一行,有两个值(列)。

这比使用 model.setData()model.setRowCount() 和手动跟踪坐标更好还是更差?

如果需要完整的上下文,则为 here。想法是手动遍历 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是一个局部变量。它用作将项目传递给模型的容器。之后就没有必要了,当它超出范围时就会被销毁。然而,这些项目将继续存在,直到从模型中移除或模型被销毁。