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