Как правильно удалить содержимое QStandardItemModel?

У меня есть QStandardItemModel это связано с QTableView, Модель имеет 6 столбцов и N строк (N увеличивается во время выполнения). Я успешно создал модель, и она была заполнена пустыми данными. Вопрос в том, как удалить и убедиться в удалении строк (и их данных) из модели?

Что я пробовал:

Я искал в Интернете, чтобы найти правильный путь, и я нашел следующее:

  1. Звонить QStandardItemModel::clearModel();

Но эта функция очищает строки и заголовки модели (что не нужно).

  1. Звонить 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;
}

Заранее спасибо.

0 ответов

Другие вопросы по тегам