Евгений Легоцкой22 января 2017 г. 10:33

Qt/C++ - Урок 059. Требуется ли удалять QStandardItem из памяти вручную при вызове метода clear в модели данных?

При работе с таблицами, да и вообще с различными данными в C++ требуется контроль над удалением, чтобы не было утечек памяти. Но требуется ли такой тотальный контроль при удалении объектов QStandardItem помещённых в QStandardItemModel , у которой вызвали метод clear ?

Такой вопрос может возникнуть исходя из того, каким образом обычно добавляются объекты QStandardItem в QStandardItemModel, а именно:

QList<QStandardItem *> items;
items.append(new QStandardItem("Item 1"));
items.append(new QStandardItem("Item 2"));
items.append(new QStandardItem("Item 3"));
model->appendRow(items);

И так далее в цикле для заполнения необходимого числа строк. При этом указатели на данные объекты нигде в коде больше не фигурируют и не удаляются. Поэтому и возникает вопрос о том, что происходит, если вызвать метод clear .

Когда объект QStandardItem передаётся в QStandardItemModel , то права собственности на данные объекты передаются в модель. И при вызове метода clear модель автоматически удаляет эти объекты из памяти.

Ниже следующий код это демонстрирует.

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QStandardItemModel>
#include <QStandardItem>
#include <QDebug>

class DestroyedItem: public QStandardItem
{
public:
    DestroyedItem(const QString & text): QStandardItem(text)
    {
        qDebug() << "Item created" << this;
    }

    ~DestroyedItem()
    {
        qDebug() << "Item destroyed" << this;
    }
};

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    QStandardItemModel *model;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QSharedPointer>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    model = new QStandardItemModel(ui->tableView);
    // Устанавливаем заголовки колонок таблицы
    model->setHorizontalHeaderLabels(QStringList() << "Column 1" << "Column 2" << "Column 3");

    QList<QStandardItem *> items;
    items.append(new DestroyedItem("Item 1"));
    items.append(new DestroyedItem("Item 2"));
    items.append(new DestroyedItem("Item 3"));
    model->appendRow(items);

    // Устанавливаем модель в объект QTableView
    ui->tableView->setModel(model);
    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    model->clear();
}

Внешний вид приложения

В данном случае в окне приложения имеется QTableView , в котором находится QStandardItemModel, а также присутствует кнопка QPushButton , по нажатию на которую модель данных очищается.

Вывод QDebug

А в выводе qDebug() мы увидим, как срабатывают деструкторы QStandardItem при нажатии кнопки QPushButton.

Item created 0x16e3540
Item created 0x16ecdd0
Item created 0x16e4e80
Item destroyed 0x16e3540
Item destroyed 0x16ecdd0
Item destroyed 0x16e4e80
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
Поддержать автора Donate

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг
СП

C++ - Тест 001. Первая программа и типы данных

  • Результат:93баллов,
  • Очки рейтинга8
VS

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:30баллов,
  • Очки рейтинга-10
J

C++ - Тест 001. Первая программа и типы данных

  • Результат:93баллов,
  • Очки рейтинга8
Последние комментарии

Qt/C++ - Урок 074. Генерация псевдослучайных чисел с использованием случайной библиотеки STD

А использование функции global() не решает ли эти проблемы? value = QRandomGenerator::global()->bounded(15, 43); Получаемая последовательность каждый раз новая.

Qt/C++ - Урок 074. Генерация псевдослучайных чисел с использованием случайной библиотеки STD

А использование функции global() не решает ли эти проблемы? value = QRandomGenerator::global()->bounded(15, 43); Получаемая последовательность каждый раз новая.
S

QML - Урок 026. Intents с Qt для Android, часть 1

Есть ли возможность приведения java типа у QAndroidJniObject? Интересует конкретно class to
ВК

Qt/C++ - Урок 015. QTableWidget или Как сделать таблицу с чекбоксами

Кто-нибудь знает, как сделать так, чтобы в QTableWidget состоящей из чекбоксов в строке таблицы можно было выбрать только один checkbox ?

Qt/C++ - Урок 006. QSqlQueryModel - Таблицы в Qt с помощью SQL-запросов

QSqlTableModel выполняет ряд стандартных операций для одной таблицы из базы данных. Поэтому там и реализован функционал по удалению и редактированию. QSqlQueryModel позволяет выполнить запр…
Сейчас обсуждают на форуме
  • Nomad
  • 1 октября 2020 г. 5:22

MyForm(forms.Form): - непонятка

понятно спасибо
S

QWebView android

На android не запускается, иначе я бы не создавал этот пост. Собственно, вопрос я решил сам, там ещё понадобилось setDomStorageEnabled(true) вызвать.

не могу передать стринг с QLineEdit

QLineEdit *myLineEdit = new QLineEdit("line edit name", this); QString str = myLineEdit->text();

Siganal slot в ui

Добрый день, Не совсем понял, какой код должен находиться в слоте, но можно подключиться через лямбда функцию. connect(timer, &QTimer::timeout, this, [](){ ui->scrollArea-&g;…
VB

Лишние строки при выборке из базы данных SQLite

Ну вообще совсем без знания документации трудно что-либо написать. Я просмотрел видеокурс по моделям в Qt, несколько видеоуроков. Немного почитал документацию. Понятно, что где-то не понятно как…
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB