Domanda

Ho un QTableView che sto installando un QStyledItemDelegate personalizzato.

Oltre alla pittura elemento personalizzato, voglio per lo stile colore di sfondo della riga per gli stati di selezione / aleggiava. Il look che sto per è qualcosa di simile KGet screenshot: di KGet sfondo Fila http://www.binaryelysium.com/images/kget_background.jpeg

Qui è il mio codice:

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();
}

Il risultato è che ogni singola cellula riceve background mousedover solo quando il mouse è sopra esso, e non l'intera riga. E 'difficile da descrivere: ecco uno screenshot: Il risultato del codice di cui sopra http://www.binaryelysium.com/images/loader_bg.jpeg

In questo quadro il mouse era sopra la cella più a sinistra, da cui il fondo evidenziata .. ma voglio lo sfondo da disegnare sopra l'intera riga.

Come posso raggiungere questo obiettivo?

Edit: Con un po 'più pensato mi sono reso conto che lo stato QStyle :: State_MouseOver solo è stato passato per la cella reale che il mouse è sopra, e quando il metodo paint viene chiamato per le altre celle nella QStyle fila :: State_MouseOver non è impostato.

Quindi la domanda diventa c'è un QStyle :: State_MouseOver_ Riga Stato (risposta: no)?, Quindi come posso fare per il raggiungimento di tale

È stato utile?

Soluzione

È necessario essere dicendo la visualizzazione per aggiornare le sue cellule quando il mouse si trova sopra una fila, quindi vorrei suggerire di monitoraggio che nel modello. Poi, nel caso in vernice, è possibile richiedere che i dati dall'indice modello utilizzando un ruolo di dati personalizzato.

Altri suggerimenti

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top