通过QAbstractItemDelegate以不同方式绘制折叠的QTreeView项

时间:2015-09-17 19:00:49

标签: qt qtreeview qitemdelegate

我有一个场景,我想在QTreeView中以不同方式绘制一个项目,但是我看不到这样做,因为模型和委托都不知道折叠/视图中项目的展开状态。

请注意,这不仅仅是想要以不同方式设置风格的情况;我需要从每个索引的模型中提取数据以了解要绘制的内容,因此样式表不会削减它。

1 个答案:

答案 0 :(得分: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