Сначала я создаю QTableView с множеством строк внутри и использую QStandardItemModel для управления данными.Включить сортировку с помощью setSortingEnabled (True).После сортировки данных, нажав на заголовок, я пытаюсь удалить все строки, но это становится очень медленно.Я решил эту проблему с QSortFilterProxy.Но я не знаю, почему ...
Теперь еще один вопрос: если я сначала удаляю несколько строк, а затем пытаюсь выбрать и удалить все строки, он становится очень медленным.
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QDialog>
#include <QTableView>
#include <QVBoxLayout>
#include <QStandardItemModel>
#include <QPushButton>
class MainWindow : public QDialog
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
QTableView *tableView;
QVBoxLayout *mainLayout;
QStandardItemModel *tableModel;
QHBoxLayout *btLayout;
QPushButton *deleteAllBt;
QPushButton *delete10;
~MainWindow();
private:
int col;
void retranslateUi();
private slots:
void delete10Rows();
void deleteAllRows();
};
#endif // MAINWINDOW_H
mainwindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QDialog(parent)
{
tableView = new QTableView;
tableModel = new QStandardItemModel;
mainLayout = new QVBoxLayout;
btLayout = new QHBoxLayout;
delete10 = new QPushButton;
deleteAllBt = new QPushButton;
tableView->setAttribute(Qt::WA_DeleteOnClose);
tableView->setSortingEnabled(true);
tableView->setModel(tableModel);
btLayout->addWidget(delete10);
btLayout->addWidget(deleteAllBt);
btLayout->addStretch();
mainLayout->addWidget(tableView);
mainLayout->addLayout(btLayout);
setLayout(mainLayout);
connect(delete10, SIGNAL(clicked()), this, SLOT(delete10Rows()));
connect(deleteAllBt, SIGNAL(clicked()), this, SLOT(deleteAllRows()));
retranslateUi();
resize(QSize(600, 480));
col = 46;
for(auto i = 0; i < 10000; i++)
{
QList<QStandardItem *> items;
for(auto j = 0; j < col; j++)
{
items.append(new QStandardItem(tr("Test %1 x %2").arg(i).arg(j)));
}
tableModel->appendRow(items);
}
}
MainWindow::~MainWindow()
{
}
void MainWindow::retranslateUi()
{
setWindowTitle(tr("Test"));
delete10->setText(tr("Delete 10 Rows"));
deleteAllBt->setText(tr("Delete All"));
}
void MainWindow::delete10Rows()
{
tableModel->removeRows(10, 10);
}
// ATTENTION: Remove 10 rows first, and then try to remove all rows, it's extremely slow.
void MainWindow::deleteAllRows()
{
for(auto row = tableModel->rowCount(); row >= 0;)
{
tableModel->removeRow(--row);
}
}