2012-10-14 2 views
1

Я использую qt для разработки монитора, который показывает новые элементы журнала, полученные от сети.
Я использую QTableWidget для отображения полученных динамических элементов, полученных, а таблица показывает только 100 строк.
Проблема заключается в том, что монитор получит около 400 «сообщений» в секунду и обновит строки.
я нашел с помощью SetItem (строка, столбец, элемент) и нового QTableWidgetItem() довольно много времени, я только хочу, чтобы показать новые элементы (три струны на 3 перевалах) от верхней части к Buttom.
Но метод действительно занимает много времени, он стоит 5,281 с, когда я добавляю 4000 тестовых случаев за один раз, что должно закончиться в 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(), как описано для a previous question.

Или вы заменяете QTableWidget на QTableView и implement a table model вокруг вашей очереди.

+0

Танк вы !!! Путь настолько изящный, я попробовал другой способ избежать вызова функции, но обновление данных в другом месте. Спасибо, в конце концов !!! – Al2O3

Смежные вопросы