Qt QAbstractItemModel在树视图中滚动时很慢

问题描述:

我做了一个没有任何数据的简单模型,只是显示了一些文本。如果数据返回一个字符串,那么结果就没有问题。如果我将其更改为返回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

确实是一个QAbstractItemView问题。我试图在一段时间内解决这个问题而没有成功。我的问题是,我有一棵树,有许多按照数百万个节点排列的节点。我做了一些测试来描述QTreeView,而我发现的东西有点sh。。当你在QTreeView中向下滚动时,它会为每个已经显示的项目继续调用QAbstractItemModel :: index()。

举例说,你正在查看20 itens。预计至少有20个调用执行index(),但树视图调用index()的所有 sibiling itens。当您向下滚动时,它会再次调用index()并且可能多于一次。如果你将鼠标悬停在一个项目中,它会调用index()。如果你眨眼睛,它会为每个项目调用index()。

我的下一步是检查QTreeView(在我的情况下)如何调用它的项目模型,并尝试实现一个自定义的,优化的。