Qt QListWidget性能问题
我的应用程序(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安装对话框中的Details列表或像wireshark这样的程序的性能,这些程序没有每秒显示几行的问题,我知道高速更新的自动滚动列表是一般可能。 主要问题是:Qt有可能吗?
视图试图计算每个新项目的个体大小。 既然你可能不需要,你可以禁用它并获得一些速度:
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插入速度似乎随着列表中已有项目的数量而迅速减少。
我不确定这是否能解决您的问题,但它可能会提供一种不同的方法。
QWidget具有updatesEnabled属性,可以控制widget是否接收绘画事件。
尝试禁用此properyt然后填充您的列表,然后重新启用它来绘制您的小部件。
我希望这有帮助。
链接地址: http://www.djcxy.com/p/49673.html