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

War es hilfreich?

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top