QListWidget 分页加载大量数据,提高性能

QListWidget 加载大量数据时造成了页面的卡顿,通过分页的方式先加载一页数据,然后之后的数据通过滚动方式去加载剩余的数据量,此方法可以在大量数据插入时提高数据显示的时间
mainWindow.h

loading 变量,用于标记当前是否正在加载数据。
在加载数据之前,将 loading 设置为 true,加载完成后将其设置为 false
scrollBarValueChanged() 函数中,只有当 loadingfalse
且下一页的起始索引小于总数据条数时,才执行加载下一页数据的操作,避免了重复加载的问题

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    //计算下一页的起始索引
    int startIndexForNextPage() const {
        return (currentPage + 1) * pageSize;
    }
private slots:
    void scrollValueChanged(int value);
    void loadItems(int startIndex, int endIndex);
private:
    Ui::MainWindow *ui;
    QListWidget *listWidget;
    int currentPage = 0; //起始页当前页数
    int pageSize = 10;//每页显示的数据条数
    int totalRowCount = 50000; //总数据量
    bool loading = false; // 是否正在加载数据

};

mainWindow.cpp

#include <QScrollBar>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    listWidget = new QListWidget(this);
    setCentralWidget(listWidget);

    connect(listWidget->verticalScrollBar(), &QScrollBar::valueChanged, this, &MainWindow::scrollValueChanged);

    loadItems(0,pageSize - 1); // 加载第一页数据
    this->resize(QSize(200,200));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::scrollValueChanged(int value)
{
    int maxScrollValue = listWidget->verticalScrollBar()->maximum(); // 获取滚动条的最大值
    // 当滚动条的值达到最大值,且下一页的起始索引小于总数据条数,且当前没有正在加载数据时执行
    if (value == maxScrollValue && startIndexForNextPage() < totalRowCount && !loading) {
        loading = true; // 开始加载数据

        int nextPageStartIndex = startIndexForNextPage(); // 下一页的起始索引
        int nextPageEndIndex = nextPageStartIndex + pageSize - 1; // 下一页的结束索引
        loadItems(nextPageStartIndex, nextPageEndIndex);

        currentPage++; // 当前页数加1

        loading = false; // 加载数据完成
    }
}

void MainWindow::loadItems(int startIndex, int endIndex)
{
    endIndex = qMin(endIndex, totalRowCount - 1);  //结束索引不能超过总数据条数-1
    for (int i = startIndex; i <= endIndex; ++i) {
        QListWidgetItem *item = new QListWidgetItem(QString("Data %1").arg(i));
        listWidget->addItem(item);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值