Wie malt man den Hintergrund der gesamten Zeile in einer QStyledItemDelegate?
-
19-09-2019 - |
Frage
Ich habe eine QTableView, die ich auf eine benutzerdefinierte QStyledItemDelegate bin Einstellung.
Zusätzlich zu der benutzerdefinierten Elemente Malerei, mag ich die Zeile des Hintergrundfarbe für die Auswahl an Stil / schwebte Staaten. Der Blick, den ich für werde, ist so etwas wie dieses KGet Screenshot: KGet Row Hintergrund http://www.binaryelysium.com/images/kget_background.jpeg
Hier ist mein Code:
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();
}
Das Ergebnis ist, dass jede einzelne Zelle nur den mousedover Hintergrund aufnimmt, wenn die Maus über sie ist, und nicht die gesamte Zeile. Es ist schwer, so ist hier ein Screenshot zu beschreiben: Das Ergebnis des obigen Codes http://www.binaryelysium.com/images/loader_bg.jpeg
In diesem Bild war die Maus, um die am weitesten links stehende Zelle über, damit der markierten Hintergrund .. aber ich mag der Hintergrund über die gesamte Reihe gezogen werden.
Wie kann ich das erreichen?
Edit: Mit etwas mehr dachte ich realisiert habe, dass die QStyle :: State_MouseOver Zustand wird nur für die tatsächliche Zelle geleitet wird, die mit der Maus über, und wenn die Farbe Verfahren für die anderen Zellen in der Zeile QStyle genannt wird :: State_MouseOver nicht gesetzt ist.
Die Frage lautet also ist es ein QStyle :: State_MouseOver_ Zeile Staat? (Antwort: nein), so wie gehe ich über das Erreichen
Lösung
Sie müssen die Ansicht zu erzählen seine Zellen zu aktualisieren, wenn die Maus eine Reihe vorbei ist, so würde ich das in Ihrem Modell vorschlagen zu verfolgen. Dann in der Paint-Ereignis, können Sie für diese Daten aus dem Modellindex bitten, eine benutzerdefinierte Daten Rolle verwendet wird.
Andere Tipps
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;
}