1

QStyledItemDelegate用来为我的QTreeView.

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

ColorBook1
    Color1
    Color2
ColorBook2
    Color3

父母和孩子的风格不同,父母的选择被禁用。

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

当前行为:

在此处输入图像描述

期望的行为:

在此处输入图像描述

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

我的 StyledItemDelegate 的绘制方法如下:

我在 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 );
   }
  }
4

1 回答 1

2

你可以自己画。用于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);
}
于 2015-02-13T11:36:46.163 回答