Qt QAbstractItemModel работает медленно при прокрутке в виде дерева - PullRequest
1 голос
/ 27 февраля 2012

Я сделал простую модель без каких-либо данных, просто показывая текст.Это работает хорошо, если данные возвращают строку.Если я изменяю его на возврат 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();

    }
}

1 Ответ

1 голос
/ 26 февраля 2014

Это действительно проблема QAbstractItemView. Я пытаюсь решить эту проблему через некоторое время безуспешно. Моя проблема в том, что у меня есть дерево с числом узлов порядка миллионов. Я сделал несколько тестов для профиля QTreeView, и то, что я нашел, было немного шокирующим. Когда вы прокручиваете вниз в QTreeView, он продолжает вызывать QAbstractItemModel :: index () для каждого элемента, который уже показан.

Скажем, например, вы просматриваете 20 itens. Ожидалось, что по крайней мере 20 вызовов делают index (), но древовидное представление вызывает index () для all sibiling itens. Когда вы прокручиваете страницу вниз, она вызывает index () для всех снова и, возможно, более одного раза. Если вы наведите курсор мыши на элемент, он вызывает index (). Если вы моргнете, вызовет index () для каждого элемента.

Мой следующий шаг - проверить, как QTreeView (в моем случае) вызывает свою модель элементов, и попытаться реализовать собственную оптимизированную модель.

...