Como é que uma pintura de fundo de toda a linha em uma QStyledItemDelegate?
-
19-09-2019 - |
Pergunta
Eu tenho um QTableView que estou estabelecendo um QStyledItemDelegate personalizado por diante.
Além da pintura item personalizado, eu quero estilo cor de fundo do linha para a selecção estados / pairou. O olhar que eu estou indo para algo como neste screenshot KGet: do KGet fundo Row http://www.binaryelysium.com/images/kget_background.jpeg
Aqui está o meu código:
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();
}
O resultado é que cada célula individual recebe o fundo mousedover somente quando o mouse está sobre ele, e não a linha inteira. É difícil descrever isso aqui está uma imagem: O resultado do código acima http://www.binaryelysium.com/images/loader_bg.jpeg
Em que imagem o mouse estava sobre a célula mais à esquerda, portanto, o fundo realçado .. mas eu quero o fundo a ser desenhada sobre a linha inteira.
Como posso conseguir isso?
Edit: Com um pouco mais pensei que eu percebi que o estado QStyle :: State_MouseOver única está sendo passado para a célula real que o mouse está sobre, e quando o método de pintura é chamado para as outras células do QStyle linha :: State_MouseOver não está definido.
Portanto, a questão torna-se há uma QStyle :: State_MouseOver_ linha Estado? (Resposta: não), assim como faço para ir sobre como alcançar esse
Solução
Você precisa estar dizendo a fim de atualizar suas células, quando o mouse está sobre uma linha, então eu sugiro rastreamento que no seu modelo. Em seguida, em caso de pintura, você pode pedir que os dados do índice modelo usando um papel de dados personalizado.
Outras dicas
void TrackDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionViewItem viewOption(option);
if (viewOption.state & QStyle::State_HasFocus)
viewOption.state = viewOption.state ^ QStyle::State_HasFocus;
QImage image(m_RowBackGroundImagePath);
QPixmap pixmap(m_RowBackGroundImagePath);
qDebug()<<"forward"<<pixmap.width()<<pixmap.height();
pixmap.scaled(option.rect.width(),option.rect.height());
qDebug()<<"back"<<pixmap.width()<<pixmap.height();
qDebug()<<option.rect.width()<<option.rect.height();
QBrush brush(pixmap);
painter->save();
painter->fillRect(option.rect, brush/*QColor(238, 233, 233, 255)*/);
painter->restore();
viewOption.rect = QRect(option.rect.x(), option.rect.y(), option.rect.width(), option.rect.height());
//viewOption.palette.setColor(QPalette::Text, QColor(Qt::red));
//viewOption.palette.setBrush ( QPalette::ButtonText, brush1);
QItemDelegate::paint(painter, viewOption,index);
int progress = index.model()->data(index,Qt::DisplayRole).toInt();
QStyleOptionProgressBar progressBarOption;
progressBarOption.rect = QRect(option.rect.x(), option.rect.y()+(SETHEIGHT - PROGRESSBARHEIGHT)/2, option.rect.width(), /*option.rect.height()*/PROGRESSBARHEIGHT);
//qDebug()<<progressBarOption.rect.x()<<progressBarOption.rect.y()<<progressBarOption.rect.height()<<progressBarOption.rect.width();
//qDebug()<<option.rect.x()<<option.rect.y()<<option.rect.height()<<option.rect.width();
progressBarOption.state |= QStyle::State_Enabled;
progressBarOption.direction = QApplication::layoutDirection();
progressBarOption.fontMetrics = QApplication::fontMetrics();
progressBarOption.minimum = 0;
progressBarOption.maximum = 100;
progressBarOption.textAlignment = Qt::AlignCenter;
progressBarOption.textVisible = true;
progressBarOption.progress = progress < 0 ? 0 : progress;
progressBarOption.text = QString().sprintf("%d%%", progressBarOption.progress);
QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter);
break;
}