2012-10-14 73 views
1

我使用qt開發顯示從網絡接收到的新日誌項目的監視器。
我使用QTableWidget來顯示動態項目收到和該表只顯示100行。
問題是:監視器每秒會收到大約400條'消息'並更新這些行。
我發現使用setItem(行,列,項目)新QTableWidgetItem()是非常耗時的,我只想顯示從上最新的項目(在3個COLS三根弦)以BUTTOM。
但是這個方法非常耗時,當我一次添加4000個測試用例時,它的成本是5.281s,應該在4000/400 = 10秒內完成。
那麼它花了一半時間,如何縮短時間?任何更好的方法來使用qt tablewidget?;)感謝您的閱讀!如何優化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

回答

0

問題可能是每個呼叫QTableWidget->setItem觸發繪畫事件。您可以嘗試在功能filter_log_display()內禁用UI更新,如 a previous question所述。

或者你用你的隊列中的QTableView和implement a table model取代QTableWidget。

+0

坦克你!!!方式是如此優雅,我試過另一種方式來避免調用函數,但在其他地方更新數據。畢竟謝謝你! – Al2O3