После удаления нескольких строк я пытаюсь удалить все строки, это становится очень медленным - PullRequest
0 голосов
/ 05 июля 2019

Сначала я создаю 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);
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...