¿Cómo se puede pintar el fondo de toda la fila en una QStyledItemDelegate?
-
19-09-2019 - |
Pregunta
Tengo un QTableView que yo pongo un QStyledItemDelegate personalizado en.
Además de la pintura de elemento personalizado, quiero el estilo de color de fondo de la fila para la selección / estados rondado. El aspecto que voy a es algo así como captura de pantalla y KGet: de KGet Antecedentes Fila http://www.binaryelysium.com/images/kget_background.jpeg
Aquí está mi 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();
}
El resultado es que cada célula individual recibe el fondo mousedover sólo cuando el ratón está sobre ella, y no toda la fila. Es difícil de describir asi que aquí hay una captura de pantalla: El resultado del código anterior http://www.binaryelysium.com/images/loader_bg.jpeg
En la imagen que el ratón estaba sobre la celda más a la izquierda, por lo tanto, el fondo resaltado .. pero quiero que el fondo que se dibuja sobre toda la fila.
¿Cómo puedo lograr esto?
Edit: Con un poco más que yo he dado cuenta de que el estado Qstyle :: State_MouseOver solamente se está pasando de la célula real que el ratón está sobre, y cuando el método se llama pintura de las otras celdas de la fila Qstyle :: State_MouseOver no está establecido.
Entonces la pregunta es ¿existe un Qstyle :: State_MouseOver_ Fila Estado (respuesta: no)?, ¿Cómo hago para lograr ese
Solución
Es necesario estar diciendo la vista para actualizar sus células cuando el ratón está sobre una fila, así que yo sugeriría que el seguimiento en el modelo. Luego, en el caso de la pintura, se puede pedir que los datos del índice de modelo usando un papel de datos personalizados.
Otros consejos
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;
}