crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в QSortFilterProxyModel + QAbstractItemModel + QTreeView
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
lanz Дата 20.5.2015, 23:50
  У меня все работает :lol:
Смотрите прикрепленный проект.

Скорее всего ошибка здесь:
indxRes = createIndex(pParentItem->m_index.row(), 0, pParentItem);


Нельзя хранить индексы, если очень нужно используйте:
http://doc.qt.io/qt-4.8/qpersistentmodelindex.html
flankerr Дата 20.5.2015, 18:34
 
Цитата(lanz @ 20.5.2015, 17:45) *
Приложите минимальный проект, не помню чтобы там что то особенное было.


Если отбросить все лишнее то вот такая простая реализация модели
.h
Раскрывающийся текст
class CItem 
{
....
QString m_name;
CItem*  m_pParent;
std::vector<CItem* >    m_vChilds;
}

class CMyAbstractItemModel : public QAbstractItemModel          
{
  ....
   CItem                     *m_pRoot;

    QVariant                    data(const QModelIndex &index, int role) const;
    QVariant                    headerData(int section, Qt::Orientation orientation,
                                                int role = Qt::DisplayRole) const;
    Qt::ItemFlags               flags( const QModelIndex &index) const;

    int                         columnCount(const QModelIndex &) const;
    int                         rowCount(const QModelIndex & ind = QModelIndex()) const;
    QModelIndex                 index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
    QModelIndex                 parent(const QModelIndex &child) const;

     CItem *                     GetItem(const QModelIndex &index) const;
}


cpp
Раскрывающийся текст
QVariant CMyAbstractItemModel::data(const QModelIndex &index, int iRole) const
{
    QVariant res;

    if(!index.isValid())
    {
        return res;
    };

     CItem  *pItem = static_cast<CItem*>(index.internalPointer());

       if(iRole == Qt::DisplayRole)
        {
            if(m_pDataMng != NULL)
            {
               res = pItem->m_name;
            };
        }
return res;
}

int CMyAbstractItemModel::columnCount(const QModelIndex &) const
{
    return COL_COUNT;
};

int CMyAbstractItemModel::rowCount( const QModelIndex &indxParent) const
{
    int iRes(0);
    CItem* pData(m_pRoot);
    pData = GetItem(indxParent);
    if(pData != NULL)
    {
        iRes = pData->m_vChilds.size();
    }

    return iRes;
};

QModelIndex CMyAbstractItemModel::index(int row, int column,const QModelIndex &parent) const
{    
    if(m_pRoot == NULL)  return QModelIndex();

    QModelIndex indx;
    CItem* pChildItem(NULL);
    CItem *pParentItem(NULL);

    if (hasIndex(row, column, parent))
    {
        if (parent.isValid())
        {
            pParentItem = static_cast<CItem*>(parent.internalPointer());
        }
        else
        {
            pParentItem = m_pRoot;
        };

        if(pParentItem)
        {
            pChildItem = pParentItem->GetChildFromRow(row);
            if (pChildItem)
            {
                indx = createIndex(row, column, pChildItem);
            };
        };
    };

    return indx;
}

QModelIndex CMyAbstractItemModel::parent( const QModelIndex &index) const
{
    QModelIndex indxRes;

    if (index.isValid())
    {
        CItem* pChildItem = GetItem(index);
        if(pChildItem)
        {
            CItem* pParentItem = pChildItem->m_pParent;

            if((pParentItem != NULL) && (pParentItem != m_pRoot))
            {
                indxRes = createIndex(pParentItem->m_index.row(), 0, pParentItem);
            };
        }
    };

    return indxRes;
};

Qt::ItemFlags  CMyAbstractItemModel::flags(const QModelIndex &index) const
{  
    return Qt::ItemIsEnabled;
}

Ну и далее как я уже писал в начале
QAbstractItemModel *pModel = new CMyAbstractItemModel();
QSortFilterProxyModel *pFilter = new QSortFilterProxyModel();
pFilter->setSourceModel(pModel);
....
QTreeView::setModel(pFilter);//


QSortFilterProxyModel вообще как прослойка используется пустая как есть. Может там чтото в обязаловку надо переопределить для дерева ? Но с таблицей работает и в "пустом" виде. Для фильтрации наследую перепределяю метод фильрации и все путем. А вот с деревом какая то беда...

Qt4.8.3
lanz Дата 20.5.2015, 17:45
  Приложите минимальный проект, не помню чтобы там что то особенное было.
flankerr Дата 20.5.2015, 16:55
  Имеется дерево на QAbstractItemModel и QTreeView связка рабюотает отлично проблем нет.
Пытаюсь прикрутить QSortFilterProxyModel как есть без переобределений просто как прослйку чтобы все завелось как есть но не заваодится.

QAbstractItemModel *pModel = new CMyAbstractItemModel();
QSortFilterProxyModel *pFilter = new QSortFilterProxyModel();
pFilter->setSourceModel(pModel);
QTreeView::setModel(pFilter);

При попытке развернуть любой элемент дерева все "съезжает" перестает отображаться или отображается мягко говря не адекватно. Индексы которые приходят в ::data становятся не валидными.

Аналогичный код но с табличной моделью работает на ура. QSortFilterProxyModel() + QAbstractItemModel + QTableView - все работает как часы.
Вопрос что и как надо переопределить в QSortFilterProxyMode для работы с деревом ?
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 2:47