QtableWidget插入數據卡頓優化方法

最近要使用Qtablewidget保存4300多的數據,發現以下刷新4300條數據,界面會變得非常卡頓,於是想了優化一下;因爲要對所有數據排序,想用一下Qtablewidget自動排序功能,而且數據量不多,不想採用動態加載的方式來實現;

方法1複用內存,不重複清除創建

以前每次都會清除,然後重新創建對象,寫數據,發現重新pIterm = new QTableWidgetItem;非常耗時,導致界面卡頓;於是想複用已經創建的QTableWidgetItem,插入數據時,先獲取Qtablewidget的item,直接在上面寫數據;發現速度快了很多;

void QStockView::SlotUpdateHisDataTable(map<QString, HisAnalyzeInfo>& mapHisAnalyze)
{
    m_bUpdatingHisTable = true;
    //ui.tableWidgetHis->setUpdatesEnabled(false);
    //刪除內容
    int RowCount = ui.tableWidgetHis->rowCount();
    /*while (rownum > 0)//刪除重新插入比較耗時
    {
        ui.tableWidgetHis->removeRow(0);
        rownum--;
    }*/
    //ui.tableWidgetHis->setColumnCount(10);
    map<QString, HisAnalyzeInfo>::iterator it = mapHisAnalyze.begin();
    QTableWidgetItem* pIterm = NULL;
    
    int rownum = 0;
    //先插入已經存在的

    for (;it!= mapHisAnalyze.end();it++)
    {
        int colum = 0;
        if (RowCount>0)
        {
            //第0行是複選框,從1開始
            ui.tableWidgetHis->setRowHidden(rownum, false);
            colum = 1;
            pIterm = ui.tableWidgetHis->item(rownum,colum++);//代碼
            if (pIterm != NULL)
            {
                QString strStockCode = it->second.strCode;
                strStockCode = strStockCode.right(6);
                pIterm->setText(strStockCode);
            }
            RowCount--;//可用行數減一
            
        }
        else//插入新的數據
        {

            ui.tableWidgetHis->insertRow(rownum);
            /*QCheckBox* pCheckBox = new QCheckBox();
            pCheckBox->setFixedWidth(20);
            pCheckBox->setChecked(false);
            ui.tableWidgetHis->setCellWidget(rownum, colum++, pCheckBox);*/
            pIterm = new QTableWidgetItem;
            pIterm->setCheckState(Qt::Unchecked);
            ui.tableWidgetHis->setItem(rownum, colum++, pIterm);
            pIterm = new QTableWidgetItem;
            if (pIterm != NULL)
            {
                QString strStockCode = it->second.strCode;
                strStockCode = strStockCode.right(6);
                pIterm->setText(strStockCode);
            }
        }
        rownum++;
    }
    if (RowCount > 0)//隱藏多餘的行
    {
        for (int i=0;i<RowCount;i++)
        {
            ui.tableWidgetHis->setRowHidden(rownum+i,true);
        }
    }
    //Slotsortbyclounm(m_sortCloum);//隱藏和排序同時使用時會導致錯亂,Qtablewidget->setRowHidden()將無效該隱藏的行沒有隱藏;,所以這裏註釋掉 m_bUpdatingHisTable = false; }

(2)經過上述方法發現,當數據量是4000多時,雖然複用了內存空間,重新刷新一次也要十幾秒的時間,而且界面會卡住無響應

原因竟然是第一列採用QCheckBox* pCheckBox = new QCheckBox();插入的複選框,導致刷新數據會非常卡,換成了QTableWidgetItem(pIterm = new QTableWidgetItem; pIterm->setCheckState(Qt::Unchecked))自帶的checkbox功能後,用統一的QTableWidgetItem去寫數據,不用自定義的widget去設置,速度會很快,4000多條數據1秒之後就加載完成,非常快。也不卡;

 遇到的問題

Qtablewidget->setRowHidden()之後緊跟排序Slotsortbyclounm(m_sortCloum),setRowHidden()將會無效,導致無法隱藏想要隱藏的行;可以考慮用信號槽去關聯,或者等到隱藏結束,豎向滾動條的範圍發生改變時,再去排序;
Slotsortbyclounm(m_sortCloum);//隱藏和排序同時使用時會導致錯亂,Qtablewidget->setRowHidden()將無效該隱藏的行沒有隱藏;,所以這裏註釋掉 m_bUpdatingHisTable = false; }

 如果對軟件感興趣,可維新共總好:QStockView 獲取;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章