使用 QStyledItemDelegate 调整 QStandardItem 的选择行为

Adjusting the selection behaviour of QStandardItem with QStyledItemDelegate

我正在使用 QStyledItemDelegate 为我的 QTreeView 中的项目设置样式。

我的树视图的根没有装饰。它只是一棵简单的树,其关系类似于下面的树:

ColorBook1
    Color1
    Color2
ColorBook2
    Color3

父项和子项的样式不同,父项的选择被禁用。

我想自定义子节点中的选择行为,以便子节点周围的选择矩形覆盖整行,而不是单独的文本子节点。

当前行为:

期望的行为:

有什么方法可以使用 QStyledItemDelegate 像这样扩展选择矩形吗?我在 QStyledItemDelegate::paintQStyleOptionViewItem 参数中尝试 adjusting rect。但这将子节点文本移到了左侧。我想将文本节点保持在同一位置,但只有选择矩形必须向左调整。所以就像在 paint 方法中绘制文本和像素图一样,有没有办法绘制选择矩形(使用默认选择矩形颜色)?

我的StyledItemDelegate的paint方法如下:

我在 QStyledItemDelegate::paint 方法中使用了以下代码:

void paint( QPainter * inPainter, const  QStyleOptionViewItem & inOption, const QModelIndex & inIndex ) const
  {
   if( inIndex.data( Qt::UserRole ) == ColorInfoType::kColorBook )
   {
      QFont font = inPainter->font();
      font.setWeight( QFont::Bold );
      font.setPointSize( 8 );
      inPainter->setFont( font );
      inPainter->drawText
         (
            inOption.rect.adjusted( 5,0,0,0 ),
            inIndex.data( Qt::DisplayRole ).toString(),
            QTextOption( Qt::AlignVCenter | Qt::AlignLeft )
         );
   }
   else
   {
      //To Do: draw the selection rect after adjusting the size.
      // Draw the Color Name text
      QStyledItemDelegate::paint( inPainter, inOption, inIndex );
   }
  }

你可以自己画。使用 option.palette.brush(QPalette::Highlight) 获取高亮颜色。

在这个片段中,我只是手动绘制空白区域。我也改变了颜色,但你不必那样做。

void StyleDel::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    if(option.state.testFlag(QStyle::State_Selected))
    {
        QStyleOptionViewItem newOption = option;
        newOption.state = option.state & (~QStyle::State_HasFocus);
        QBrush brush = option.palette.brush(QPalette::Highlight);
        brush.setColor(QColor(150,0,0,100));

        newOption.palette.setBrush(QPalette::Highlight, brush);
        QRect s_rect = newOption.rect; //we use this rect to define the blank area
        s_rect.setLeft(0); // starts from 0
        s_rect.setRight(newOption.rect.left()); //ends where the default rect starts
        painter->fillRect(s_rect, newOption.palette.brush(QPalette::Highlight));
        QStyledItemDelegate::paint(painter, newOption, index);
        return;
    }
    QStyledItemDelegate::paint(painter, option, index);
}