algorithm - 如何优化qt tablewidget刷新?

标签 algorithm qt user-interface optimization

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

filterLog函数代码:

    start = clock();
    filter_log_display();
    duration_filterLogDisplay += (double)(finish - start) / CLOCKS_PER_SEC;

filter_log_display():

    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;
    }

关于时间的分析::) 有很多地方可以优化,包括这个:)

enter image description here

最佳答案

问题可能是每次调用 QTableWidget->setItem 都会触发一个 paint 事件。您可以尝试在函数 filter_log_display() 中禁用 UI 更新,如 a previous question .

或者用 QTableView 和 implement a table model 替换 QTableWidget围绕您的队列。

关于algorithm - 如何优化qt tablewidget刷新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12879951/

相关文章:

algorithm - 3d 装箱算法

c++ - C++中的大整数

java - JTextAreas在JDialog中是不可见的,我添加了setVisible函数,还是不行

Qt - 在 Canvas 上绘图

python - PyQt:为什么新窗口打开后立即关闭

android - Froyo 上的按钮突出显示行为发生了变化?

javascript - 找不到数组逆向算法问题的解决方案

c# - 生成具有特定总和的随机整数

Qpushbutton 悬停/按下图标

c++ - 获取 QOpenGLFramebufferObject 抗锯齿纹理的替代方法,而不是多重采样 + blitting