Algorithm 如何优化qt tablewidget刷新?

Algorithm 如何优化qt tablewidget刷新?,algorithm,qt,user-interface,optimization,Algorithm,Qt,User Interface,Optimization,我正在使用qt开发一个监视器,显示从网络接收到的新日志项。 我使用QTableWidget显示收到的动态项目,表格仅显示100行。 问题是:监视器每秒将接收大约400条“消息”,并更新行。 我发现使用setItem(行、列、项)和new QTableWidgetItem()非常耗时,我只想从上到下显示最新的项(3列的三个字符串)。 但是这种方法确实很耗时,当我一次添加4000个测试用例时,需要花费5.281秒,应该在4000/400=10秒内完成。 所以它花费了一半的时间,如何缩短时间?使用qt

我正在使用qt开发一个监视器,显示从网络接收到的新日志项。
我使用QTableWidget显示收到的动态项目,表格仅显示100行。
问题是:监视器每秒将接收大约400条“消息”,并更新行。
我发现使用setItem(行、列、项)new QTableWidgetItem()非常耗时,我只想从上到下显示最新的项(3列的三个字符串)。
但是这种方法确实很耗时,当我一次添加4000个测试用例时,需要花费5.281秒,应该在4000/400=10秒内完成。
所以它花费了一半的时间,如何缩短时间?使用qt tablewidget有更好的方法吗?;)谢谢你的阅读

filterLog函数代码:

    start = clock();
    filter_log_display();
    duration_filterLogDisplay += (double)(finish - start) / CLOCKS_PER_SEC;
筛选日志显示()

clock_t start=clock();
行_可选=假;
ui->tableWidget->setRowCount(0)//删除所有表项
行_可选=真;
int size_1=logDisplayQueue.size()-1;
ui->tableWidget->verticalScrollBar()->setSliderPosition(0);
如果(尺寸_1+1<100)
{
ui->tableWidget->setRowCount(大小为1+1);
}
其他的
{
ui->tableWidget->setRowCount(100);
}
时钟\u t finish=时钟();
持续时间设置行数+=(双精度)(完成-开始)/时钟每秒;
对于(int queue_i=size_1,index=0;queue_i>=0;queue_i--,index++)
{
开始=时钟();
LogInfoItem*LogiItem=(LogInfoItem*)logDisplayQueue.at(队列i);
完成=时钟();
持续时间\u GetItemFQUE+=(双精度)(完成-开始)/时钟\u/秒;
开始=时钟();
QString BITS_str=bits2Hexs(logItem->BITS);
完成=时钟();
持续时间(比特数为2hex+=(双精度)(完成-开始)/每秒时钟数;
开始=时钟();
ui->tableWidget->setItem(索引,0,新的QTableWidgetItem(登录项->时间));//时间
ui->tableWidget->setItem(索引,1,新的QTableWidgetItem(登录项->名称));//名称
ui->tableWidget->setItem(索引,2,新的QTableWidgetItem(BITS_str));//位
完成=时钟();
持续时间设置项+=(双精度)(完成-开始)/时钟每秒;
开始=时钟();
如果(queue_i==oldRowItemNo)ui->tableWidget->selectRow(index);
完成=时钟();
持续时间(如果选择行+=(双精度)(完成-开始)/每秒时钟;
}
关于时间的分析:)有很多地方需要优化,包括这个:)


问题可能是每次调用
QTableWidget->setItem
都会触发一个绘制事件。您可以尝试在函数中禁用UI更新
filter\u log\u display()
,如所述


或者您可以用QTableView和队列周围的QTableWidget替换QTableWidget。

谢谢!!!这种方法非常优雅,我尝试了另一种方法来避免调用函数,而是在别处更新数据。谢谢大家!!!
    clock_t start = clock();
    row_selectable = false;
    ui->tableWidget->setRowCount(0);//delete table items all
    row_selectable = true;

    int size_1 = logDisplayQueue.size() - 1;

    ui->tableWidget->verticalScrollBar()->setSliderPosition(0);

    if(size_1+1 < 100)
    {
        ui->tableWidget->setRowCount(size_1 + 1);
    }
    else
    {
        ui->tableWidget->setRowCount(100);
    }
    clock_t finish = clock();
    duration_setRowCount += (double)(finish - start) / CLOCKS_PER_SEC;

    for(int queue_i = size_1, index = 0; queue_i >= 0; queue_i--, index++)
    {
        start = clock();
        LogInfoItem* logItem = (LogInfoItem*)logDisplayQueue.at(queue_i);
        finish = clock();
        duration_getItemFQueue += (double)(finish - start) / CLOCKS_PER_SEC;

        start = clock();
        QString BITS_str = bits2Hexs(logItem->BITS);
        finish = clock();
        duration_bits2Hexs += (double)(finish - start) / CLOCKS_PER_SEC;

        start = clock();
        ui->tableWidget->setItem(index, 0, new QTableWidgetItem(logItem->time));//time
        ui->tableWidget->setItem(index, 1, new QTableWidgetItem(logItem->name));//name
        ui->tableWidget->setItem(index, 2, new QTableWidgetItem(BITS_str));//BITS
        finish = clock();
        duration_setItem += (double)(finish - start) / CLOCKS_PER_SEC;

        start = clock();
        if(queue_i == oldRowItemNo)ui->tableWidget->selectRow(index);
        finish = clock();
        duration_ifSelectRow += (double)(finish - start) / CLOCKS_PER_SEC;
    }