我有一个 QTableView,我正在设置一个自定义 QStyledItemDelegate 。
除了自定义项目绘画之外,我还想为选择/悬停状态设置行的背景颜色。我想要的外观类似于 KGet 屏幕截图: KGet 的行背景 http://www.binaryelysium.com/images/kget_background.jpeg
这是我的代码:
void MyDelegate::paint( QPainter* painter, const QStyleOptionViewItem& opt, const QModelIndex& index ) const
{
QBrush backBrush;
QColor foreColor;
bool hover = false;
if ( opt.state & QStyle::State_MouseOver )
{
backBrush = opt.palette.color( QPalette::Highlight ).light( 115 );
foreColor = opt.palette.color( QPalette::HighlightedText );
hover = true;
}
QStyleOptionViewItemV4 option(opt);
initStyleOption(&option, index);
painter->save();
const QStyle *style = option.widget ? option.widget->style() : QApplication::style();
const QWidget* widget = option.widget;
if( hover )
{
option.backgroundBrush = backBrush;
}
painter->save();
style->drawPrimitive(QStyle::PE_PanelItemViewItem, &option, painter, widget);
painter->restore();
switch( index.column() )
{
case 0: // we want default behavior
style->drawControl(QStyle::CE_ItemViewItem, &option, painter, widget);
break;
case 1:
// some custom drawText
break;
case 2:
// draw a QStyleOptionProgressBar
break;
}
painter->restore();
}
结果是每个单独的单元格仅在鼠标悬停在其上时才接收到 mousedover 背景,而不是整行。很难描述所以这里是截图: 上面代码的结果 http://www.binaryelysium.com/images/loader_bg.jpeg
在那张图片中,鼠标位于最左边的单元格上,因此突出显示了背景..但我希望将背景绘制在整行上。
我怎样才能做到这一点?
编辑:有了更多的想法,我意识到 QStyle::State_MouseOver 状态仅被传递给鼠标所在的实际单元格,并且当为行中的其他单元格调用绘制方法时 QStyle::State_MouseOver 不是放。
所以问题变成了是否存在 QStyle::State_MouseOver_Row状态(答案:否),那么我该如何实现呢?