3

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;如何确保模型在分配堆栈时不会泄漏内存,但包含大量指向堆上对象的指针?

4

1 回答 1

3

注意:是QStandardItemModel::appendRow,不是QStandardItemModel::addRow

现在进入主题:

您无需担心手动销毁QStandardItem对象。当他们所属的模型被破坏时,他们也是如此。

为了演示从QStandardItem继承并将调试消息放入析构函数中,如下所示:

我的项目.h

#ifndef MYITEM_H
#define MYITEM_H

#include <QStandardItem>

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

#endif // MYITEM_H

我的项目.cpp

#include "MyItem.h"

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

}

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

主窗口.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是一个局部变量。它用作将项目传递给模型的容器。之后它就没有必要了,并且在超出范围时被销毁。然而,这些项目将继续存在,直到从模型中删除或模型被破坏。

于 2018-08-13T13:56:24.333 回答