QtQAbstractItemModel在树视图中滚动时速度较慢
Qt QAbstractItemModel slow when scrolling in treeview
我制作了一个没有任何数据的简单模型,只显示了一些文本。如果数据返回一个字符串,结果会很好。如果我将其更改为返回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(在我的例子中)如何调用其项模型,并尝试实现一个自定义的、优化的模型。
相关文章:
- 使用一个考虑到std::map中键值的滚动或换行的键
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 文件系统:复制功能的速度秘诀是什么
- QScrollArea:由垂直滚动条引起的水平滚动条
- 跟踪滚动条上的鼠标事件
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 如何在不使用滚动条的情况下使视图更改
- 如何为对象生成滚动效果?
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 如何模拟不同边数的骰子滚动?
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 如何初始化升压滚动窗口累加器?
- 查找标准::hash_map与标准::矢量的速度
- 加快在C++中读取/处理日志文件的速度
- 实现包含多个 QQuickPaintedItems 的 QQuickView 的滚动
- 为什么这些算法的运行速度比它们应该的要快?
- 通过水平滚动条更改标签
- 在C++中放慢滚动速度
- QtQAbstractItemModel在树视图中滚动时速度较慢