gpt4 book ai didi

c++ - QStandardItemModel 中项目的重新分配

转载 作者:太空狗 更新时间:2023-10-29 21:11:04 28 4
gpt4 key购买 nike

当分配在堆栈上的 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() 和手动跟踪坐标好还是坏?

如果需要完整的上下文,它是 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");
}

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

关于c++ - QStandardItemModel 中项目的重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51822782/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com