2012-02-27 13 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

+0

ありがとうございます。私はちょうど私が理解していなかったいくつかの他の問題があると信じていました。その遅い理由を理解していない。その唯一の500行。 –

答えて

0

本当にQAbstractItemViewの問題です。私はこの問題をしばらくのうちに解決しようとしています。私の問題は、私は数千のオーダーのノード数を持つツリーを持っているということです。私はQTreeViewのプロファイルを作成するためにいくつかのテストを行いました。 QTreeViewをスクロールダウンすると、すでに表示されているすべての項目に対してQAbstractItemModel :: index()が呼び出されます。

たとえば、20 itensを表示しているとします。少なくとも20回の呼び出しではindex()が呼び出されると予想されていましたが、ツリービューではのすべてののインデックスがindex()を呼び出します。下にスクロールすると、誰でものインデックス()が再びと呼び出されます。項目にマウスを置くと、index()が呼び出されます。あなたの目を点滅させると、すべての項目に対してindex()が呼び出されます。

私の次のステップは、QTreeView(私の場合)がアイテムモデルをどのように呼び出してカスタム最適化されたものを実装しようとしているかをチェックすることです。

関連する問題