从聚合线程更新 QListView 会使 GUI 冻结

问题描述 投票:0回答:1
在一个简单的应用程序中,我有一个

Mainwindow

,其中包含使用 
QListView
QAbstractListModel

当我启动应用程序时,我使用线程工作线程启动一个线程,该线程从外部 Web 服务获取数据记录,每个线程获取 10-20 条记录 迭代。

问题:

在从大 while 循环中的线程工作者开始的

HttpAggrigator

 类中,迭代每个返回的记录,我向另一个名为 
ViewControler
 的类发出信号,它的工作是填充 
QListView
 模型。

在这部分中,我的窗口只是冻结,直到所有项目都在列表视图中设置。

我检查了名为“

Sleepy”的分析工具,确实,设置项目的ViewControler

方法导致速度变慢。

流程:

  • MainWindow
     -> 开始 
    HttpAggrigator
    (在不同的线程中)。
  • HttpAggrigator
     -> 获取记录 -> 开始迭代它们(以填充数据对象)。
  • HttpAggrigator
     -> 在每次记录迭代时向 
    ViewControler
     发出信号,将项目构建到 
    MainWindow
     
    QListView
添加项目时如何防止 GUI 冻结和变慢?

c++ multithreading qt qlistview
1个回答
1
投票
每次向模型添加项目时,都会导致视图重新绘制自身。您应该将项目聚合到一个列表中并立即将其插入模型中。您将有 1 次重画,而不是 n 次重画

一次对多个项目使用这样的方法

void LostModel::addItems(QList<MyItem *> items) { if(items.size()) { int begin = MyItemList.size(); beginInsertRows(QModelIndex(), begin, begin + items.size() - 1); MyItemList.append(items); endInsertRows(); } }
    
© www.soinside.com 2019 - 2024. All rights reserved.