我做了一個沒有任何數據的簡單模型,只是顯示了一些文本。如果數據返回一個字符串,那麼結果就沒有問題。如果我將其更改爲返回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();
}
}
你可以改用QString :: number。它應該更快,因爲它不必解析%1的字符串並銷燬不必要的臨時對象。 – Correa 2012-02-27 02:35:48
謝謝。我只相信還有一些其他問題,我不明白。不明白爲什麼它緩慢。它只有500行。 – 2012-02-27 02:37:58