Russian Qt Forum
Сентябрь 29, 2024, 10:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: TreeModel + QSortFilterProxyModel + QTableView  (Прочитано 3725 раз)
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. Не помогло.

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

Сообщений: 296



Просмотр профиля
« Ответ #1 : Январь 07, 2013, 17:19 »

Интересно почему тема не раскрыта.
Меня интересует как вообще дерево в tableview засунуть. Прочитал что можно как то через proxymodel, но будет ли она корректно отображаться. TableView поймет где заголовок и надо объединить колонки данной строки. Или лучше переписать QTableView?
Записан

Qt 5.11.0, Win, MinGW
edwardoid
Гость
« Ответ #2 : Январь 07, 2013, 18:58 »

Интересно почему тема не раскрыта.
Меня интересует как вообще дерево в tableview засунуть. Прочитал что можно как то через proxymodel, но будет ли она корректно отображаться. TableView поймет где заголовок и надо объединить колонки данной строки. Или лучше переписать QTableView?

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

A QSortFilterProxyModel нужен для сортировки и фильтрации, отображения не всего дерева, а скажем как-то части.
« Последнее редактирование: Январь 07, 2013, 19:00 от edwardoid » Записан
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #3 : Январь 07, 2013, 19:21 »

Цитировать
Почитайте про Model/View. Если вы написали модель(просто наследуйте QAbstractItemModel и в вашем QTreeView(например) вызовите QTreeView::setModel(QAbstractItemModel* model). Если вы внимательно прочитаете документаю про QAbstractItemModel и QTreeView, то поймете как в в заголовках отображать данные(Headers), и отображать данные в самом дереве(QAbtractItemModel::data(int)). 
не понимаю к чему вы это написали.

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

Записан

Qt 5.11.0, Win, MinGW
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.202 секунд. Запросов: 22.