Evgenii Legotckoi
Қаң. 22, 2017, 9:33 Т.Қ.

Qt/C++ - Сабақ 059. Деректер үлгісінде таза әдісті шақырған кезде QStandardItem элементін жадтан қолмен жою керек пе?

Кестелермен және шын мәнінде C ++ тілінде әртүрлі деректермен жұмыс істегенде, жадтың ағып кетуін болдырмау үшін жоюды бақылау қажет. Бірақ clear әдісі шақырылған QStandardItemModel ішінде орналастырылған QStandardItem нысандарын жою кезінде мұндай жалпы бақылау қажет пе?

Мұндай сұрақ әдетте 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();
}

Қолданбаның көрінісі

Бұл жағдайда қолданба терезесінде QStandardItemModel бар QTableView бар, сонымен қатар QPushButton түймесі бар, оны басу арқылы деректер үлгісі тазартылады.

QDebug шығысы

Ал qDebug() шығысында QPushButton. түймесі басылғанда QStandardItem деструкторлары қалай іске қосылатынын көреміз.

Item created 0x16e3540
Item created 0x16ecdd0
Item created 0x16e4e80
Item destroyed 0x16e3540
Item destroyed 0x16ecdd0
Item destroyed 0x16e4e80

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз