通过 QAbstractItemDelegate 以不同方式绘制折叠的 QTreeView 项目
Paint a collapsed QTreeView item differently via a QAbstractItemDelegate
我有一个场景,我想在折叠时以不同的方式绘制 QTreeView
中的项目,但我看不到这样做的方式,因为模型和代表都不知道collapsed/expanded 视图中项目的状态。
请注意,这不仅仅是希望它的样式有所不同的情况;我需要从每个索引的模型中提取数据以了解要绘制的内容,因此样式表不会削减它。
这并不容易,但我想我可以提供帮助。您需要创建一个委托,您还将在其中引用您的模型(如果有的话,还有一个代理)。
这是我为我的音乐播放器制作的。请注意,我使用了 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 class 你有:
bool QTreeView::isExpanded(const QModelIndex & index) const
您可以检查您的物品是否展开,以进行一些特殊的绘画操作。
通过一些努力,您可以实现如下目标:
我有一个场景,我想在折叠时以不同的方式绘制 QTreeView
中的项目,但我看不到这样做的方式,因为模型和代表都不知道collapsed/expanded 视图中项目的状态。
请注意,这不仅仅是希望它的样式有所不同的情况;我需要从每个索引的模型中提取数据以了解要绘制的内容,因此样式表不会削减它。
这并不容易,但我想我可以提供帮助。您需要创建一个委托,您还将在其中引用您的模型(如果有的话,还有一个代理)。
这是我为我的音乐播放器制作的。请注意,我使用了 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 class 你有:
bool QTreeView::isExpanded(const QModelIndex & index) const
您可以检查您的物品是否展开,以进行一些特殊的绘画操作。
通过一些努力,您可以实现如下目标: