使用QStyledItemDelegate调整QStandardItem的选择行为

时间:2015-02-13 03:20:54

标签: c++ qt qpainter qstyleditemdelegate

我正在使用QStyledItemDelegateQTreeView中的项目设置样式。

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

ColorBook1
    Color1
    Color2
ColorBook2
    Color3

父母和孩子的样式不同,父母的选择也被禁用​​。

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

当前行为:

enter image description here

所需行为:

enter image description here

有没有办法使用QStyledItemDelegate像这样扩展选择矩形?我在adjusting的{​​{1}}参数中尝试rect QStyleOptionViewItem。但是这会将子节点文本移动到左侧。我想将文本节点保持在同一位置,但只有选择矩形必须调整到左侧。就像在绘制方法中绘制文本和像素图一样,有没有办法绘制选择矩形(使用默认的选择矩形颜色)?

我的StyledItemDelegate的paint方法如下:

我在QStyledItemDelegate :: paint方法中使用以下代码:

QStyledItemDelegate::paint

1 个答案:

答案 0 :(得分: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);
}