QLabel не прозрачен при отображении на делегате элемента (QStyledItemDelegate) - PullRequest
1 голос
/ 13 января 2012

У меня странная проблема. У меня есть наследование делегата элемента от QStyledItemDelegate, цвет фона - градиентный, который выглядит следующим образом:

void ItemDelegate::paintActiveOverlay( QPainter* painter,
                                       qreal x,
                                       qreal y,
                                       qreal w,
                                       qreal h ) const 
{
    QPalette palette;
    QColor highlightColor = palette.color(QPalette::Highlight);
    QColor backgroundColor = palette.color(QPalette::Base);
    const float animation = 0.25;
    const int gradientRange = 16;

    QColor color2 = QColor::fromHsv(
        highlightColor.hue(),
        (int) (backgroundColor.saturation() * (1.0f - animation) + 
        highlightColor.saturation() * animation),
        (int) (backgroundColor.value() * (1.0f - animation) + 
        highlightColor.value() * animation) );

    QColor color1 = QColor::fromHsv(
        color2.hue(),
        qMax(color2.saturation() - gradientRange, 0),
        qMin(color2.value() + gradientRange, 255) );

    QRect rect( (int)x, (int)y, (int)w, (int)h);

    painter->save();
    painter->setPen(Qt::NoPen);

    QLinearGradient linearGradient(0, 0, 0, rect.height());
    linearGradient.setColorAt(0.0, color1);
    linearGradient.setColorAt(1.0, color2);

    painter->setBrush(linearGradient);
    painter->drawRect(rect);
    painter->restore();
}

Он вызывается из метода рисования также в конструкторе ItemDelegate Iустановили QLabel следующим образом:

 QRect rect(40, 30, 401, 31);
 Qt::TextInteractionFlags flags =     
      Qt::LinksAccessibleByKeyboard | 
      Qt::LinksAccessibleByMouse    |
      Qt::TextBrowserInteraction    |
      Qt::TextSelectableByKeyboard  |
      Qt::TextSelectableByMouse;
 Qt::TextFormat txtFormat = Qt::PlainText;

 pTextEdit_title = new QLabel();
 pTextEdit_title->setTextFormat(txtFormat);
 pTextEdit_title->setTextInteractionFlags(flags);
 pTextEdit_title->setGeometry(rect);

и в методе рисования ItemDelegate я установил QLabel для рендеринга следующим образом:

  pTextEdit_title->setText(Title);
  QRect TextEditRect(option.rect.x()+THUMB_WIDTH+THUMB_WIDTH+PADDING, option.rect.y() ,
  pTextEdit_title->width(), pTextEdit_title->height());
  QPixmap pixmap(pTextEdit_title->size());
  pTextEdit_title->render(&pixmap);
  painter->drawPixmap(TextEditRect,pixmap);

он рендеритQLabel файл, но проблема в том, что он имеет серый фон и не действует как прозрачный фон, мой вопрос: как установить прозрачный фон QLabel?
также, почему TextInteractionFlags, которые я устанавливаю, игнорируется, я могуничего не делать с текстом.

Ответы [ 2 ]

0 голосов
/ 13 января 2012

При рендеринге виджета фон виджета всегда рисуется. Существует специальный флаг рендеринга, чтобы отключить рендеринг фона виджета.

Это объясняется в руководстве по API qwidget.

0 голосов
/ 13 января 2012

Прозрачность цвета зависит от значения alpha канала :

Альфа-канал цвета определяет эффект прозрачности, 0 представляет полностью прозрачный цвет, в то время как 255 представляет полностью непрозрачный цвет.

По умолчанию это 255, поэтому вы должны указать желаемое значение в качестве четвертого аргумента для используемых вами функций fromHsv.

В качестве альтернативы вы можете использовать функцию setAlpha.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...