Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QLabel在项委托(QStyledItemDelegate)上呈现时不透明_C++_Qt_Delegates - Fatal编程技术网

C++ QLabel在项委托(QStyledItemDelegate)上呈现时不透明

C++ QLabel在项委托(QStyledItemDelegate)上呈现时不透明,c++,qt,delegates,C++,Qt,Delegates,我有一个奇怪的问题,我让项目委托从QStyledItemDelegate继承 背景色为渐变色,如下所示: void ItemDelegate::paintActiveOverlay( QPainter* painter, qreal x, qreal y, qrea

我有一个奇怪的问题,我让项目委托从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();
}
 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);
  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);
它是从paint方法调用的,也是在ItemDelegate构造函数中调用的,我将QLabel设置为:

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();
}
 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);
  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);
在ItemDelegate的paint方法中,我将QLabel设置为如下方式渲染:

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();
}
 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);
  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被忽略的原因是,我无法对文本执行任何操作。

颜色透明度取决于:

颜色的alpha通道指定透明度效果0 表示完全透明的颜色,而255表示完全透明的颜色 不透明的颜色

默认情况下,它是255,因此您应该在正在使用的函数中指定所需的值作为第四个参数


或者,您可以使用该函数。

呈现小部件时,始终绘制小部件背景。有一个特殊的渲染标志来禁用小部件背景的渲染


qwidget api手册中对此进行了解释。

是的,我使用了:QPalette pptexEdit_title->palette;//将背景颜色设置为黑色p.setColorQPalette::background,Qt::transparent;pTextEdit_title->setPalettep;还是灰色的背景…我该怎么做?我没有找到任何教程?我尝试实现以下内容:。但它仍然是灰色的,我怀疑这与我设置的项目背景颜色有关