如何优化qt qtablewidget刷新?

时间:2012-10-14 06:45:07

标签: algorithm qt user-interface optimization

我正在使用qt开发一个监视器,显示从网络收到的新日志项 我使用 QTableWidget 显示收到的动态商品,表格仅显示100行。
问题是:监视器每秒会收到大约400条“消息”并更新行 我发现使用 setItem(row,col,item)新的QTableWidgetItem()非常耗时,我只想显示最新的项目(3个字符串的三个字符串) )从顶部到底部 但是这种方法非常耗时,当我一次添加4000个测试用例时,它的成本为5.281秒,应该在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

1 个答案:

答案 0 :(得分:0)

问题可能是QTableWidget->setItem的每次调用都会触发绘制事件。您可以尝试在函数filter_log_display()内部禁用UI更新,如上所述 a previous question

或者用QTableView替换QTableWidget并在队列中替换implement a table model