Russian Qt Forum

Qt => Model-View (MV) => Тема начата: edwardoid от Июнь 26, 2012, 13:09



Название: TreeModel + QSortFilterProxyModel + QTableView
Отправлено: edwardoid от Июнь 26, 2012, 13:09
Проблема такая:
Есть модель, наследующая QAbstractItemModel (ItemsModel). Она имеет древовидную структуру и используется в QTreeView. Нужно использовать ее через proxy(используется класс QSortFilterProxyModel(ItemsProxyModel)) в QTableView.

В искомой модели:
Код
C++ (Qt)
int ItemsModel::columnCount(QModelIndex& parent) const
{
return 1;
}

А в proxy модели, т.к. я исользую ее в QTableView мне нужны несколько колонок в которых будет разная информация из соответствующего item-a из оригинальной модели:
Код
C++ (Qt)
int ItemsProxyModel::columnCount(QModelIndex& parent) const
{
return 5;
}

Потому:
Код
C++ (Qt)
QVariant ItemsProxyModel::data(QModelIndex& index, int role)
{
const int  r = index.row(),
 c = index.column();
QModelIndex itemIndex = itemIndex = this->index(r, 0, index.parent());
itemIndex = mapToSource(itemIndex);
ItemsModel model = dynamic_cast<ItemsModel*>(sourceModel());
Item* item = model->getItem(itemIndex);
if(role == Qt::DisplayRole)
{
 if(c == 0)
 {
return model->data(itemIndex, role);
 }
 return item->infoForColumn(c);
}
return QSortFilterProxyModel::data(index, role)
}

Я не знаю почему, но в функцию ItemsProxyModel::data(QModelIndex& index, int role) приходят индексы, в которых c < 1. Т.е не приходят индексы других колонок.
Вместе с тем QTreeView рисует таблицу с 5 столбцами(Которые нельзя пометить, они disabled).
Побовал переопределить Qt::ItemFlags QAbstractProxyModel::flags ( const QModelIndex & index ) const. Не помогло.

Вопрос: как мне добиться, чтобы и в других колонках показывалась нужная мне информация?


Название: Re: TreeModel + QSortFilterProxyModel + QTableView
Отправлено: kolob от Январь 07, 2013, 17:19
Интересно почему тема не раскрыта.
Меня интересует как вообще дерево в tableview засунуть. Прочитал что можно как то через proxymodel, но будет ли она корректно отображаться. TableView поймет где заголовок и надо объединить колонки данной строки. Или лучше переписать QTableView?


Название: Re: TreeModel + QSortFilterProxyModel + QTableView
Отправлено: edwardoid от Январь 07, 2013, 18:58
Интересно почему тема не раскрыта.
Меня интересует как вообще дерево в tableview засунуть. Прочитал что можно как то через proxymodel, но будет ли она корректно отображаться. TableView поймет где заголовок и надо объединить колонки данной строки. Или лучше переписать QTableView?

Почитайте про Model/View (http://"http://qt-project.org/doc/qt-4.8/model-view-programming.html"). Если вы написали модель(просто наследуйте QAbstractItemModel и в вашем QTreeView(например) вызовите QTreeView::setModel(QAbstractItemModel* model). Если вы внимательно прочитаете документаю про QAbstractItemModel и QTreeView, то поймете как в в заголовках отображать данные(Headers), и отображать данные в самом дереве(QAbtractItemModel::data(int)).  

A QSortFilterProxyModel нужен для сортировки и фильтрации, отображения не всего дерева, а скажем как-то части.


Название: Re: TreeModel + QSortFilterProxyModel + QTableView
Отправлено: kolob от Январь 07, 2013, 19:21
Цитировать
Почитайте про Model/View. Если вы написали модель(просто наследуйте QAbstractItemModel и в вашем QTreeView(например) вызовите QTreeView::setModel(QAbstractItemModel* model). Если вы внимательно прочитаете документаю про QAbstractItemModel и QTreeView, то поймете как в в заголовках отображать данные(Headers), и отображать данные в самом дереве(QAbtractItemModel::data(int)). 
не понимаю к чему вы это написали.

Есть модель иерархическая, нужно ее вставить в TableView, но только чтобы она корректно отображалась. Родительский итем как сплошная строка. А дочерние в каждой колонке. Как то так.
Вот пример.