2012-02-27 23 views
0

我做了一個沒有任何數據的簡單模型,只是顯示了一些文本。如果數據返回一個字符串,那麼結果就沒有問題。如果我將其更改爲返回QString("%1").arg(index.row());,則在我的樹視圖中滾動時會開始變慢。Qt QAbstractItemModel在樹視圖中滾動時很慢

QModelIndex CvMaskModel::index(int row, int column, const QModelIndex & parent) const 
{ 
    if(!hasIndex(row,column,parent)) 
     return QModelIndex(); 

    void * parentitem; 
    if (!parent.isValid()) 
    { 
     parentitem = m_rootmodel; 

    } 
    else 
     parentitem = parent.internalPointer(); 

    if (parentitem == m_rootmodel) 
    { 
     //auto meta =m_rootmodel->data(m_rootmodel->index(row),MetaImageFile::MetaImageFileRole).value<MetaImageFile*>(); 
     return createIndex(row,column,m_root); 
    } 
    return QModelIndex(); 
    //TreeItem *parentItem; 
    //if(!parent.isValid()) 
    ImageListModel* parentItem = static_cast<ImageListModel*>(parent.internalPointer()); 
    QString data; 
    if(parentItem == m_rootmodel) 
    { 

     data = m_rootmodel->data(parentItem->index(row),MetaImageFile::MetaImageFileNameRole).toString(); 

    } 
    switch(parent.column()) 
    { 
    case 0: 
     return createIndex(row,column,0); 
    default: 
      return QModelIndex(); 
    } 


} 
QModelIndex CvMaskModel::parent (const QModelIndex & index) const 
{ 
    if (!index.isValid()) 
     return QModelIndex(); 

    root* parentItem = static_cast<root*>(index.internalPointer()); 
    if(parentItem) 
     return QModelIndex(); 


    switch(index.column()) 
    { 
    case 0: 
     return QModelIndex(); 
    default: 
      return QModelIndex(); 
    } 



} 
int CvMaskModel::rowCount (const QModelIndex & parent) const 
{ 
    if (!parent.isValid()) 
     return m_rootmodel->rowCount(); 


    switch(parent.column()) 
    { 
    case 0: 
     return 1; 
     //return m_masks.value(m_rootmodel->data(parent,MetaImageFile::MetaImageFileRole).value<MetaImageFile*>()).size(); 
    case 1: 
     return 0; 
    default: 
     return 0; 
    } 

} 
int CvMaskModel::columnCount (const QModelIndex & /*parent*/ ) const 
{ 
    return 3; 
} 
QVariant CvMaskModel::data (const QModelIndex & index, int role) const 
{ 
    if (!index.isValid() || index.row() > m_rootmodel->rowCount()) 
     return QVariant(); 


    //if (role != Qt::DisplayRole) 
    //  return QVariant(); 
    QVariant val; 
    switch(index.column()) 
    { 
    case 0: 
     return QString("%1").arg(index.row()); 
     //val = m_rootmodel->data(index,MetaImageFile::MetaImageFileNameRole); 
     //return val; 
    case 1: 
     return "HEJ"; 
    default: 
     return QVariant(); 

    } 
} 
+1

你可以改用QString :: number。它應該更快,因爲它不必解析%1的字符串並銷燬不必要的臨時對象。 – Correa 2012-02-27 02:35:48

+0

謝謝。我只相信還有一些其他問題,我不明白。不明白爲什麼它緩慢。它只有500行。 – 2012-02-27 02:37:58

回答

0

確實是一個QAbstractItemView問題。我試圖在一段時間內解決這個問題而沒有成功。我的問題是,我有一棵樹,有許多按照數百萬個節點排列的節點。我做了一些測試來描述QTreeView,而我發現的東西有點sh。。當你在QTreeView中向下滾動時,它會爲每個已經顯示的項目繼續調用QAbstractItemModel :: index()。

舉例說,你正在查看20 itens。預計至少有20個調用執行index(),但樹視圖調用index()的所有 sibiling itens。當您向下滾動時,它會再次調用index()並且可能多於一次。如果你將鼠標懸停在一個項目中,它會調用index()。如果你眨眼睛,它會爲每個項目調用index()。

我的下一步是檢查QTreeView(在我的情況下)如何調用它的項目模型,並嘗試實現一個自定義的,優化的。

相關問題