QtQAbstractItemModel在树视图中滚动时速度较慢

Qt QAbstractItemModel slow when scrolling in treeview

本文关键字:速度 滚动 视图 QtQAbstractItemModel      更新时间:2023-10-16

我制作了一个没有任何数据的简单模型,只显示了一些文本。如果数据返回一个字符串,结果会很好。如果我将其更改为返回QString("%1").arg(index.row());,则在树视图中滚动时它开始变慢。

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();
    }
}

这确实是一个QAbstractItemView问题。我试图在一段时间内解决这个问题,但没有成功。我的问题是,我有一棵树,树上有很多节点,它们的顺序是毫秒。我做了一些测试来评测QTreeView,发现有点摇晃。当你在QTreeView中向下滚动时,它会为已经显示的每个项目调用QAbstractItemModel::index()。

例如,假设您正在查看20个itens。预计至少有20个调用do index(),但树视图为所有可能的itens调用index()。当你向下滚动时,它会再次调用index()来为每个调用,可能不止一次。如果将鼠标悬停在它调用index()的项目中。如果你眨眼,它会为每个项目调用index()。

我的下一步是检查QTreeView(在我的例子中)如何调用其项模型,并尝试实现一个自定义的、优化的模型。