![](/img/trans.png)
[英]QAbstractItemModel->setItemData returns false when inserting Qt::UserRole
[英]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個iten。 預計至少有20次調用做index(),但是樹視圖為所有平移iten調用index()。 向下滾動時,它將再次為每個人調用index(),並且可能再調用一次。 如果將鼠標懸停在某個項目上,它將調用index()。 如果眨眼,它將為每個項目調用index()。
下一步是檢查QTreeView(以我為例)如何調用其項目模型,並嘗試實現定制的,優化的模型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.