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

¿Fue útil?

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top