Настройка поведения выбора QStandardItem с помощью QStyledItemDelegate

Я использую QStyledItemDelegate стилизовать предметы в моем QTreeView,

Корни моего дерева не украшены. Это просто простое дерево с отношением, похожим на приведенное ниже:

ColorBook1
    Color1
    Color2
ColorBook2
    Color3

Родитель и дочерний элемент оформлены по-разному, и выбор родительского элемента отключен.

Я хочу настроить поведение выделения в дочерних узлах так, чтобы прямоугольник выделения вокруг дочернего узла охватывал всю строку, а не только дочерний текст.

Текущее поведение:

Желаемое поведение:

Есть ли способ расширить прямоугольник выделения, как это, используя QStyledItemDelegate? Я старался adjusting rect в QStyleOptionViewItem параметр QStyledItemDelegate::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 );
   }
  }

1 ответ

Решение

Вы можете нарисовать это самостоятельно. использование 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);
}
Другие вопросы по тегам