我的應用程序(Qt 4.6)要求我在列表中顯示某些消息,該列表在添加新行時總是向下滾動(因此最近的行始終可見)。Qt QListWidget性能問題
由於我在整個過程中遇到了性能問題,包括顯示這些單行消息,我運行了一些測試,發現我使用的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有可能嗎?
謝謝一堆!事情是,我已經嘗試限制更新,但我總是隻寫入processEvents()語句的更新限制。原來,如果像你這樣的條件是速度巨大的差異,將scrollToBottom()移動到該位置!我認爲我的應用程序應該在使用您的方法時獲得的速度很好。 –
只要你不使用包裝或IconView模式,統一大小的唯一問題似乎是缺少水平滾動條。但是由於QListView只是從一個項目中獲得一次大小,所以你可以設置一個委託,這個'sizeHint'函數將返回一個足夠大的尺寸來存放最寬的項目。 – alexisdm
我和我的QtListWidget有類似的速度問題,它拿着〜17k項目。 setUniformItemSizes(true)方法大大加快了應用程序的速度!謝謝你的提示。 –