Comment peut-on peindre l'arrière-plan de la ligne entière dans un QStyledItemDelegate?

StackOverflow https://stackoverflow.com/questions/2434004

  •  19-09-2019
  •  | 
  •  

Question

J'ai un QTableView que je suis en train d'un QStyledItemDelegate personnalisé sur.

En plus de la peinture à l'élément personnalisé, je veux le style de la couleur de fond de la ligne pour la sélection / états plané. Le regard que je vais faire quelque chose comme cette capture d'écran KGet: Contexte Row KGet http://www.binaryelysium.com/images/kget_background.jpeg

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

Le résultat est que chaque cellule individuelle reçoit le fond de mousedover uniquement lorsque la souris est au-dessus, et non la totalité de la ligne. Il est difficile de décrire est une capture d'écran alors voici: Le résultat du code ci-dessus http://www.binaryelysium.com/images/loader_bg.jpeg

Dans cette image la souris était sur la cellule la plus à gauche, d'où l'arrière-plan mis en surbrillance .. mais je veux l'arrière-plan à tirer sur toute la ligne.

Comment puis-je y parvenir?

Edit: Avec un peu plus pensé que je me suis rendu compte que l'état QStyle :: State_MouseOver est uniquement passé pour la cellule réelle que la souris est terminée, et lorsque la méthode de peinture est appelée pour les autres cellules de la ligne QStyle :: State_MouseOver n'est pas réglé.

La question devient donc est-il un QStyle :: State_MouseOver_ Row état (réponse: non)?, Comment dois-je aller sur la réalisation que

Était-ce utile?

La solution

Vous devez être dire en vue de mettre à jour ses cellules lorsque la souris est sur une ligne, je vous conseille donc suivi que dans votre modèle. Ensuite, en cas de peinture, vous pouvez demander que les données de l'index de modèle en utilisant un rôle de données personnalisées.

Autres conseils

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top