2015-09-17 6 views
0

У меня есть сценарий, когда я хочу покрасить элемент в QTreeView по-разному, когда он рухнул, но я не вижу способа сделать это, так как ни модель, ни делегат не имеют знание состояния свернутого/расширенного состояния предмета в представлении.Покрасьте свернутый элемент QTreeView по-другому через QAbstractItemDelegate

Обратите внимание, что это не просто случай, когда нужно, чтобы стиль был по-разному; Мне нужно вытащить данные из модели за индекс, чтобы знать, что рисовать, поэтому стили не собираются ее сокращать.

ответ

2

Это непросто, но я думаю, что смогу помочь. Вам нужно создать делегат, где у вас будет также ссылка вашей модели (и прокси-сервера, если она у вас есть).

Вот что я сделал для своего музыкального плеера. Обратите внимание, что я использовал 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 

Вы можете проверить, если ваш товар расширен или не делать какие-то специальные операции рисования.

С некоторой тяжелой работой, вы можете достичь что-то вроде этого: Custom delegate in QTreeView

+0

Я только что пришел с идеей того, чтобы позволить трюм делегата на указатель копирования на QTreeView. Поскольку в моем случае есть отношение 1: 1 от делегата к делегату, это должно быть абсолютно безопасным, даже если оно нарушает модель модели/представления Qt. Благодаря! –

 Смежные вопросы

  • Нет связанных вопросов^_^