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
是一个局部变量。它用作将项目传递给模型的容器。之后就没有必要了,当它超出范围时就会被销毁。然而,这些项目将继续存在,直到从模型中移除或模型被销毁。
当分配在堆栈上的 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
是一个局部变量。它用作将项目传递给模型的容器。之后就没有必要了,当它超出范围时就会被销毁。然而,这些项目将继续存在,直到从模型中移除或模型被销毁。