Кестелермен және шын мәнінде 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