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);
    }
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QListWidget加载大量数据时可能会导致界面切换卡顿的问题。为了解决这个问题,可以考虑以下几点: 1. 优化加载速度:可以使用insertItem()方法将最新的操作记录插入到最上方,而不是使用addItem()方法逐个在下方插入数据。这样可以确保最新的记录在最上方,提高加载速度。 2. 分段式加载:可以使用分段式加载的方式,每次加载一定数量的数据,例如每次加载12个记录。可以定义一个计数器i,每次加载12个记录后,进行一次刷新,并延迟一段时间再加载下一段数据。可以使用QTime来设定延迟刷新的时间间隔,并使用QCoreApplication::processEvents()来刷新界面。 以上是对于如何优化QListWidget加载大量数据的建议,希望对您有所帮助。请注意,以上建议仅供参考,具体的优化方式还需根据您的具体需求和代码实现进行调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [QT记录一个解决QlistWidget列表项加载较慢的问题](https://blog.csdn.net/weixin_43865793/article/details/128855443)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [QListWidget加载大量图片,溢出内容无法显示](https://blog.csdn.net/qq_42078231/article/details/114825228)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值