Настройка поведения выбора 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);
}
2

Другие решения


По вопросам рекламы [email protected]