Pergunta

Eu tenho um QTableView que estou estabelecendo um QStyledItemDelegate personalizado por diante.

Além da pintura item personalizado, eu quero estilo cor de fundo do linha para a selecção estados / pairou. O olhar que eu estou indo para algo como neste screenshot KGet: do KGet fundo Row http://www.binaryelysium.com/images/kget_background.jpeg

Aqui está o meu 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();
}

O resultado é que cada célula individual recebe o fundo mousedover somente quando o mouse está sobre ele, e não a linha inteira. É difícil descrever isso aqui está uma imagem: O resultado do código acima http://www.binaryelysium.com/images/loader_bg.jpeg

Em que imagem o mouse estava sobre a célula mais à esquerda, portanto, o fundo realçado .. mas eu quero o fundo a ser desenhada sobre a linha inteira.

Como posso conseguir isso?

Edit: Com um pouco mais pensei que eu percebi que o estado QStyle :: State_MouseOver única está sendo passado para a célula real que o mouse está sobre, e quando o método de pintura é chamado para as outras células do QStyle linha :: State_MouseOver não está definido.

Portanto, a questão torna-se há uma QStyle :: State_MouseOver_ linha Estado? (Resposta: não), assim como faço para ir sobre como alcançar esse

Foi útil?

Solução

Você precisa estar dizendo a fim de atualizar suas células, quando o mouse está sobre uma linha, então eu sugiro rastreamento que no seu modelo. Em seguida, em caso de pintura, você pode pedir que os dados do índice modelo usando um papel de dados personalizado.

Outras dicas

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top