crossplatform.ru

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

> QSortFilterProxyModel + QAbstractItemModel + QTreeView, После добавлении QSortFilterProxyModel перстает работать QTreeView
flankerr
  опции профиля:
сообщение 20.5.2015, 16:55
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


Имеется дерево на QAbstractItemModel и QTreeView связка рабюотает отлично проблем нет.
Пытаюсь прикрутить QSortFilterProxyModel как есть без переобределений просто как прослйку чтобы все завелось как есть но не заваодится.

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

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

Аналогичный код но с табличной моделью работает на ура. QSortFilterProxyModel() + QAbstractItemModel + QTableView - все работает как часы.
Вопрос что и как надо переопределить в QSortFilterProxyMode для работы с деревом ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
lanz
  опции профиля:
сообщение 20.5.2015, 17:45
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Приложите минимальный проект, не помню чтобы там что то особенное было.

Сообщение отредактировал lanz - 20.5.2015, 17:46
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 20.5.2015, 18:34
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


Цитата(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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.12.2024, 9:33