2013-08-24 51 views
0

我不知道如何解決這個大數據問題。建議使用表視圖來處理大數據以提高速度,而不是使用表格窗口小部件。數據將最多爲200000行×300列的字符串。此外,它可能在結構上存在差距。對於視圖,需要定義一個模型。我還沒有做到這一點,我不知道以下幾點:使用Qt表格顯示大數據查看

如果用戶只希望替換列中的某些值並檢查數據,使用View會更快嗎? QList是速度需求的明智選擇,還是有更好的選擇?以及如何實現這個模型?

回答

2

QTableWidget使用自己的Model作爲後端(其數據的容器)。人們不能(或者不應該)自定義QTableWidget的模型。 QTableWidget中的每個單元都由QTableWidgetItem表示。他們的寫作是爲了解決一般問題,並不是那麼快。

當你決定使用一個QTableView與QAbstractTableModel派生自己的模型作爲後端時,可以加快分配速度。我發現花費最多處理時間的事情之一就是行的大小計算。我重載size​​HintForRow在我的表是這樣的:

int MyTable::sizeHintForRow (int row) const 
{ 
    //All rows have the same height in MyTable, hence we use the height of the 
    // first row for performance reasons. 
    if(cachedRowSizeHint_ == -1) 
    { 
    cachedRowSizeHint_ = 
     model()->headerData(0, Qt::Vertical, Qt::SizeHintRole).toSize().height(); 
    } 
    return cachedRowSizeHint_; 
} 

實現一個簡單的表格模型是很容易的(Qt的幫助文件已經足夠......)。可以從提供最小角色數據開始(編輯和顯示)。 TableModel數據總是可以根據需要使用QIdentityProxyModels進行修改。如果您的模型不起作用,請發佈您的代碼。請記住,不是爲角色返回無效數據e.g:

QVariant IO_PluginMngr::data(const QModelIndex & index, int role) const 
{ 
    if(index.isValid()) 
    { 
    if(role == Qt::DisplayRole) 
    { 
     return sequence_[index.row()][index.column()]; 
    } 
    } 
    return QVariant(); 
} 

返回例如用於尤其是SizeHintRole錯誤數據會造成嚴重破壞的意見。

我注意到在實現模型時,應該在適當的時候努力調用begin/endInsertRows,否則持久模型索引不起作用。

我們寫了更復雜的表格,其中數據在後臺的線程中被修改,並在更新表格之前換出。其中一個可以加快速度的領域是從不對模型中的數據進行排序,而是使用引用真實(無序)數據的有序參考序列。我們有大約1000行和50列的表格,每秒更新一次(包含很多視圖),我們的處理器處理器佔用的處理器大約爲20%,但最大的速度提升是緩存sizeHint。