3

スタックに割り当てられた が破棄されると、モデル内のポインタが指しているオブジェクト (たとえば、次の例の/ポインタ)QStandardItemModelはどうなりますか?itemitem2

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ます。これは、上記の「リスト」オブジェクトが 2 つの値 (列) を持つ 1 つの行であることを意味します。

model.setData()これは、 を使用しmodel.setRowCount()て手動で座標を追跡するよりも良いですか、悪いですか?

完全なコンテキストが必要な場合は、ここにあります。アイデアは、手動でQSqlQuery結果をループし、行をチャンクでフェッチすることです。関連するメソッドは と呼ばれloadChunkます。

モデルがスタックに割り当てられている場合、モデルにロードされたアイテムの割り当て解除を何らかの形で管理する必要がありますかaddRow()

TLDR; モデルがスタックに割り当てられているときにモデルがメモリをリークしないようにする方法はありますが、ヒープ上のオブジェクトへのポインタがたくさん含まれていますか?

4

1 に答える 1

3

注: では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ローカル変数です。項目をモデルに渡すためのコンテナーとして使用されます。その後は不要で、範囲外になると破棄されます。ただし、アイテムはモデルから削除されるか、モデルが破棄されるまで存在し続けます。

于 2018-08-13T13:56:24.333 に答える