Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QtQlistWidget性能问题_Qt_Qt4 - Fatal编程技术网

QtQlistWidget性能问题

QtQlistWidget性能问题,qt,qt4,Qt,Qt4,我的应用程序(Qt4.6)要求我在一个列表中显示某些消息,该列表在添加新行时总是向下滚动(因此最近的一行总是可见的) 由于我在整个过程中(包括显示这些单行消息)存在性能问题,因此我运行了一些测试,并发现用于此的QListWidget是主要问题 我已经创建了一个简单的测试项目,其中有一个默认的列表小部件“listWidget”和一个按钮“button”,它在一个点击循环中添加1000项。这两个小部件添加到主窗口的布局中。 以下是.cpp代码(.h为默认值+插槽定义) 这会大大加快速度,但scrol

我的应用程序(Qt4.6)要求我在一个列表中显示某些消息,该列表在添加新行时总是向下滚动(因此最近的一行总是可见的)

由于我在整个过程中(包括显示这些单行消息)存在性能问题,因此我运行了一些测试,并发现用于此的QListWidget是主要问题

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

这会大大加快速度,但scrollToBottom()不再工作

有人知道如何提高速度吗?只要他们使用Qt,就可以自由地提出完全不同的方法

[编辑]
看看Qt Creator或wireshark等程序的安装对话框中的详细信息列表的性能,这些程序每秒显示几行都没有问题,我知道通常可以快速更新自动滚动列表。主要问题是:Qt是否可能实现这一点?

我不确定这是否能解决您的问题,但它可能提供一种不同的方法

QWidget具有允许您控制小部件是否接收绘制事件的属性

尝试禁用此属性,然后填充列表,然后重新启用它以重新绘制小部件


我希望这有帮助。

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

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();
}
void主窗口::打开按钮释放()
{
静态时间速率定时器;
rateTimer.start();
对于(int-iLine=0;iLine<50000;iLine++)
{
ui->listWidget->addItem(
QString(“%1:这是一个伪文本”)
.arg(QString::number(iLine).RightJustized(5,'0'))
);
//限制为60次更新/秒
如果(rateTimer.appeased()>1000/60){
ui->listWidget->scrollToBottom();
QApplication::processEvents();
rateTimer.restart();
}
}
//对于上次processEvents()之后添加的项目
ui->listWidget->scrollToBottom();
}

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

不幸的是,这对我的情况没有帮助,每当添加一行时,我都需要更新小部件。主要的问题是重新油漆太慢了…非常感谢!问题是,我已经尝试过限制更新,但我总是围绕processEvents()语句编写更新限制。事实证明,将scrollToBottom()移动到这种情况下,速度会有巨大的差异!我认为我的应用程序应该可以满足您使用方法时的速度。只要您不使用包装或IconView模式,统一大小的唯一问题似乎是缺少水平滚动条。但是,由于QListView只从其中一个项目获取一次大小,您可以设置一个委托,该委托的
sizeHint
函数将返回足够大的大小,以容纳最宽的项目。我的QtListWidget也有类似的速度问题,它容纳了约17k个项目。setUniformItemSizes(true)方法大大加快了应用程序的速度!谢谢你的提示。
ui->listWidget->setUniformItemSizes(true);
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();
}