gpt4 book ai didi

c++ - 在 TreeView 中滚动时 Qt QAbstractItemModel 变慢

转载 作者:太空宇宙 更新时间:2023-11-04 12:11:50 25 4
gpt4 key购买 nike

我做了一个没有任何数据的简单模型,只显示了一些文本。如果 data 返回一个字符串,它就可以正常工作。如果我将其更改为返回 QString("%1").arg(index.row()); 在我的 TreeView 中滚动时它开始变慢。

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 个项目。预计至少有 20 次调用 index(),但 TreeView 为 all 兄弟项调用了 index()。当您向下滚动时,它会为每个人再次调用 index() 并且可能不止一次。如果您将鼠标悬停在一个项目上,它会调用 index()。如果您眨眼,它会为每个项目调用 index()。

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

关于c++ - 在 TreeView 中滚动时 Qt QAbstractItemModel 变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9459259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com