1

ネットワークから受信した新しいログ項目を表示するモニターを開発するために qt を使用しています。QTableWidget
を使用して受信した動的アイテムを表示すると、テーブルには 100 行しか表示されません。 問題は、モニターが毎秒約 400 の「メッセージ」を受信し、行を更新することです。 setItem (row,col,item)new QTableWidgetItem()を使用するとかなり時間がかかることがわかりました。最新のアイテム (3 つの列に 3 つの文字列) を上から下に表示したいだけです。 しかし、この方法は非常に時間がかかります。一度に 4000 個のテスト ケースを追加すると 5.281 秒かかり、4000/400 = 10 秒で終了するはずです。半分の時間がかかるので、時間を短縮するにはどうすればよいですか?qt テーブルウィジェットを使用するためのより良い方法はありますか?



;) 読んでくれてありがとう!

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

時間に関する分析: :) これを含め、最適化する場所はたくさんあります :)

ここに画像の説明を入力

4

1 に答える 1

0

問題は、 の各呼び出しがQTableWidget->setItemペイント イベントをトリガーすることである可能性があります。前の質問filter_log_display()で説明し たように、関数内で UI の更新を無効にすることができます。

または、QTableWidget を QTableView に置き換えて、キューの周りにテーブル モデルを実装します。

于 2012-10-14T10:29:15.753 に答える