16,817
社区成员




class Dialog(QDialog):
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
self.setAttribute(Qt.WA_DeleteOnClose)
self.setWindowTitle("Test")
self._layout = QVBoxLayout(self)
self._layout.setAlignment(Qt.AlignLeft)
self.table = QTableView(self)
self.table.setSortingEnabled(True)
self.model = QStandardItemModel(self)
colCount = 46
for i in range(10000):
# 后 5000 行有70列
if i > 5000:
colCount = 70
lst = [QStandardItem('Test %s,%s' % (i, j)) for j in range(colCount)]
self.model.appendRow(lst)
sortProxy = QSortFilterProxyModel(self)
sortProxy.setSourceModel(self.model)
self.table.setModel(sortProxy)
btLayout = QHBoxLayout()
deleteBt = QPushButton(self)
deleteBt.setText('Delete All')
delete10 = QPushButton(self)
delete10.setText('Delete 10 rows')
deleteBt.clicked.connect(self.deleteRows)
delete10.clicked.connect(self.delete10Rows)
self._layout.addWidget(self.table)
self._layout.addLayout(btLayout)
btLayout.addWidget(deleteBt)
btLayout.addWidget(delete10)
btLayout.addStretch()
def delete10Rows(self):
self.table.model().removeRows(10, 10)
# 如果列数全部相同,不删除10行,直接选中删除全部行要2秒
# 如果列数全部相同,先删除10行,再选中删除全部行要 无穷 秒。。
# 如果列数不同,全部选中删除要70秒
def deleteRows(self):
selectModel = self.table.selectionModel()
selectedRows = selectModel.selectedRows()
if len(selectedRows) == 0:
return
selectedRows.sort(key=lambda x: x.row(), reverse=True)
for index in selectedRows:
self.table.model().removeRow(index.row())
if __name__ == '__main__':
app = QApplication(sys.argv)
main = Dialog()
main.show()
sys.exit(app.exec_())
#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);
}
// 先删除 10行,再删除所有,会非常慢
void MainWindow::deleteAllRows()
{
auto selectionModel = tableView->selectionModel();
auto selectedRows = selectionModel->selectedRows();
if (selectedRows.size() == 0)
return;
for(auto row = tableModel->rowCount(); row >= 0; --row)
{
tableModel->removeRow(row);
}
}
#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
#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++)
{
if (i > 5000)
col = 70; //后 5000 行 70列
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);
}
void MainWindow::deleteAllRows()
{
for(auto row = tableModel->rowCount(); row >= 0;)
{
tableModel->removeRow(--row);
}
}