Как нарисовать фон всей строки в QStyledItemDelegate? - PullRequest
1 голос
/ 12 марта 2010

У меня есть QTableView, для которого я устанавливаю пользовательский QStyledItemDelegate.

В дополнение к пользовательской раскраске элементов, я хочу стилизовать цвет фона строки для состояний выделения / наведения. Внешний вид, который я собираюсь сделать, похож на этот скриншот KGet: Фон строки KGet http://www.binaryelysium.com/images/kget_background.jpeg

Вот мой код:

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

В результате каждая отдельная ячейка получает фон mousedover только тогда, когда на нем находится мышь, а не весь ряд. Трудно описать, вот скриншот: Результат приведенного выше кода http://www.binaryelysium.com/images/loader_bg.jpeg

На этом рисунке мышь была над самой левой ячейкой, отсюда и выделенный фон ... но я хочу, чтобы фон рисовался по всей строке.

Как мне этого добиться?

Редактировать: Подумав еще немного, я понял, что состояние QStyle :: State_MouseOver передается только для фактической ячейки, над которой находится мышь, и когда метод рисования вызывается для других ячеек в строке QStyle :: State_MouseOver не установлен.

Таким образом, возникает вопрос: существует ли состояние QStyle :: State_MouseOver_ Row (ответ: нет), так как мне добиться этого?

Ответы [ 2 ]

0 голосов
/ 23 апреля 2012
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;
}
0 голосов
/ 15 марта 2010

Вы должны указать представлению обновить его ячейки, когда мышь находится над строкой, поэтому я бы посоветовал отслеживать это в вашей модели. Затем в событии рисования вы можете запросить эти данные из модельного индекса, используя пользовательскую роль данных.

...