Это непросто, но я думаю, что смогу помочь. Вам нужно создать делегат, где у вас будет также ссылка вашей модели (и прокси-сервера, если она у вас есть).
Вот что я сделал для своего музыкального плеера. Обратите внимание, что я использовал QStyledItemDelegate и не QAbstractItemDelegate:
void YourItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStandardItem *item = _model->itemFromIndex(_proxy->mapToSource(index));
switch (item->type()) {
case Miam::IT_Album:
this->paintRect(painter, o);
this->drawAlbum(painter, o, static_cast<AlbumItem*>(item));
break;
case Miam::IT_Artist:
this->paintRect(painter, o);
this->drawArtist(painter, o, static_cast<ArtistItem*>(item));
break;
case Miam::IT_Disc:
this->paintRect(painter, o);
this->drawDisc(painter, o, static_cast<DiscItem*>(item));
break;
case Miam::IT_Separator:
this->drawLetter(painter, o, static_cast<SeparatorItem*>(item));
break;
case Miam::IT_Track: {
/// etc
break;
}
default:
QStyledItemDelegate::paint(painter, o, index);
break;
}
}
Тогда в классе QTreeView у вас есть:
bool QTreeView::isExpanded(const QModelIndex & index) const
Вы можете проверить, если ваш товар расширен или не делать какие-то специальные операции рисования.
С некоторой тяжелой работой, вы можете достичь что-то вроде этого:
Я только что пришел с идеей того, чтобы позволить трюм делегата на указатель копирования на QTreeView. Поскольку в моем случае есть отношение 1: 1 от делегата к делегату, это должно быть абсолютно безопасным, даже если оно нарушает модель модели/представления Qt. Благодаря! –