使用 QStyledItemDelegate 调整 QStandardItem 的选择行为
Adjusting the selection behaviour of QStandardItem with QStyledItemDelegate
我正在使用 QStyledItemDelegate
为我的 QTreeView
中的项目设置样式。
我的树视图的根没有装饰。它只是一棵简单的树,其关系类似于下面的树:
ColorBook1
Color1
Color2
ColorBook2
Color3
父项和子项的样式不同,父项的选择被禁用。
我想自定义子节点中的选择行为,以便子节点周围的选择矩形覆盖整行,而不是单独的文本子节点。
当前行为:
期望的行为:
有什么方法可以使用 QStyledItemDelegate
像这样扩展选择矩形吗?我在 QStyledItemDelegate::paint
的 QStyleOptionViewItem
参数中尝试 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);
}
我正在使用 QStyledItemDelegate
为我的 QTreeView
中的项目设置样式。
我的树视图的根没有装饰。它只是一棵简单的树,其关系类似于下面的树:
ColorBook1
Color1
Color2
ColorBook2
Color3
父项和子项的样式不同,父项的选择被禁用。
我想自定义子节点中的选择行为,以便子节点周围的选择矩形覆盖整行,而不是单独的文本子节点。
当前行为:
期望的行为:
有什么方法可以使用 QStyledItemDelegate
像这样扩展选择矩形吗?我在 QStyledItemDelegate::paint
的 QStyleOptionViewItem
参数中尝试 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);
}