gpt4 book ai didi

Qt QListWidget 性能问题

转载 作者:行者123 更新时间:2023-12-04 13:15:31 27 4
gpt4 key购买 nike

我的应用程序 (Qt 4.6) 要求我在列表中显示某些消息,该列表在添加新行时总是向下滚动(因此最近的行始终可见)。

由于我在包括显示这些单行消息在内的整个过程中遇到性能问题,所以我运行了一些测试并发现我用于此的 QListWidget 是主要问题。

我创建了一个简单的测试项目,其中包含一个默认列表小部件“listWidget”和一个按钮“pushButton”,它在单击时循环添加 1000 个项目。这两个小部件被添加到主窗口的布局中。这是 .cpp 代码(.h 是默认值 + 插槽定义)

#include "MainWindow.h"
#include "ui_MainWindow.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}

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

void MainWindow::on_pushButton_released()
{
for( int iLine = 0; iLine < 1000; iLine++ )
{
ui->listWidget->addItem(
QString( "%1: This is a dummy text" )
.arg( QString::number( iLine ).rightJustified( 4, '0' ) )
);
ui->listWidget->scrollToBottom();
QApplication::processEvents();
}
}

没有scrollToBottom() 性能还可以,但是如果我添加scrollToBottom,它还需要我添加processEvents() 来重新绘制,事情开始变得非常缓慢。当您调整窗口的高度(以及隐含的列表小部件)时,您可以从字面上看到更新速度的变化。

我尝试过使用性能标志,例如在构造函数中添加以下行:

ui->listWidget->setLayoutMode( QListWidget::Batched );
ui->listWidget->setBatchSize( 10 );

这大大加快了速度,但 scrollToBottom() 不再起作用。

有人知道如何提高速度吗?只要他们使用 Qt,请随意提出完全不同的方法。

[编辑]看看例如的性能Qt Creator的安装对话框中的详细信息列表或像wireshark这样的程序在每秒显示几行时没有问题,我知道通常可以高速更新的自动滚动列表。主要问题是:Qt 可以做到这一点吗?

最佳答案

View 尝试计算每个新项目的单独大小。由于您可能不需要它,您可以禁用它并通过以下方式获得一些速度:

ui->listWidget->setUniformItemSizes(true);

而且您实际上也不需要“在添加一行时更新小部件”,即使这是可能的,因为您不会看到高于特定更新率的任何差异。
因此,您可以使用计时器(QTime 或 QElapsedTimer)来限制您实际滚动的速率并强制重绘:

void MainWindow::on_pushButton_released()
{
static QTime rateTimer;
rateTimer.start();

for( int iLine = 0; iLine < 50000; iLine++ )
{
ui->listWidget->addItem(
QString( "%1: This is a dummy text" )
.arg( QString::number( iLine ).rightJustified( 5, '0' ) )
);

// Limit at 60 updates/s
if(rateTimer.elapsed() > 1000/60) {
ui->listWidget->scrollToBottom();
QApplication::processEvents();
rateTimer.restart();
}
}
// For the items added after the last processEvents()
ui->listWidget->scrollToBottom();
}

但是对于非常大的列表,您可能必须编写自己的从 QAbstractListModel 派生的模型,因为 QListWidget 插入速度似乎会随着列表中已有项目的数量而迅速下降。

关于Qt QListWidget 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7103943/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com