Как правильно удалить содержимое QStandardItemModel?
У меня есть QStandardItemModel
это связано с QTableView
, Модель имеет 6 столбцов и N строк (N увеличивается во время выполнения). Я успешно создал модель, и она была заполнена пустыми данными. Вопрос в том, как удалить и убедиться в удалении строк (и их данных) из модели?
Что я пробовал:
Я искал в Интернете, чтобы найти правильный путь, и я нашел следующее:
- Звонить
QStandardItemModel::clearModel();
Но эта функция очищает строки и заголовки модели (что не нужно).
- Звонить
QStandardItemModel::setRowCount(0);
Эта функция работала хорошо, когда я ее вызвал, она оставила заголовки без изменений и удалила или скрыла (я не уверен, но я хочу удалить их) строки. Посмотрев документацию, я обнаружил, что эта функция выполняет следующие действия:
Устанавливает количество строк в этой модели в строки. Если это меньше чем
rowCount()
данные в нежелательных строках отбрасываются.
И чтобы убедиться, что setRowCount(0);
удаляет строки, я смотрю на диспетчер задач, прежде чем создавать строки, приложение занимало около 13,6 МБ ОЗУ.
После создания около 1 миллиона строк приложение заняло около 965 МБ оперативной памяти.
После звонка setRowCount(0)
на 1 миллион созданных строк приложение занимало 50 МБ оперативной памяти.
Здесь возникает другой вопрос:
если setRowCount(0)
был использован для очистки всех данных из модели, так какова разница в 20 МБ до и после удаления?
Вот способ создать строки:
void customTableView::addRows()
{
QList<QStandardItem*> itemList ;
for (int var = 0; var < 1000000; ++var) {
itemList = {new QStandardItem(""),new QStandardItem(""),new QStandardItem(""),new QStandardItem(""),new QStandardItem(""),new QStandardItem("")};
m_stdItemModel->appendRow(itemList);
}
}
где m_stdItemModel
это QStandardItemModel
указатель.
Изменить: Вот минимальный код для проекта:
customTableView.h
class customTableView : public QWidget
{
Q_OBJECT
public:
explicit customTableView(QTableView* sentTableView, QWidget *parent = nullptr);
~ customTableView();
void addRow();
void setRowCount();
private:
QTableView *m_TableView;
QStandardItemModel *m_stdItemModel;
};
customTableView.cpp
#include "customtableview.h"
customTableView::customTableView(QTableView *sentTableView, QWidget *parent ):
m_TableView(sentTableView)
{
m_stdItemModel = new QStandardItemModel(this);
QStringList headerList ={"col1","col2","col3","col4","col5","co6l"};
m_stdItemModel->setHorizontalHeaderLabels(headerList);
m_TableView ->setModel(m_stdItemModel);
}
void customTableView::addRow()
{
QList<QStandardItem*> itemList ;
for (int var = 0; var < 1000000; ++var) {
itemList = {new QStandardItem(""),new QStandardItem(""),new QStandardItem(""),new QStandardItem(""),new QStandardItem(""),new QStandardItem("")};
m_stdItemModel->appendRow(itemList);
}
}
void customTableView:: setRowCount()
{
m_stdItemModel->setRowCount(0);
}
customTableView::~customTableView()
{
delete m_stdItemModel;
}
mainwindow.h
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_addRowButton_clicked();
void on_clearModelContentButton_clicked();
private:
Ui::MainWindow *ui;
customTableView *m_custTableView;
};
mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_custTableView = new customTableView(ui->uiTableView,this);
}
void MainWindow::on_addRowButton_clicked()
{
m_custTableView->addRow();
}
void MainWindow::on_clearModelContentButton_clicked()
{
m_custTableView->setRowCount();
}
MainWindow::~MainWindow()
{
delete m_custTableView;
delete ui;
}
Заранее спасибо.