声明式alpha转换器

declarative alpha changer

本文关键字:转换器 alpha 声明      更新时间:2023-10-16

我想写一个QDeclarativeItem FadeEdges,我从QML实例化,如在这个例子中:

FadeEdges {
  Text {
    id: sometext
    text: "some text"
  }
}

sometext重绘之后,我想减少它在边缘绘制的像素的alpha(从完全不透明到透明)。所以它的渲染边缘将会褪色。我的问题是,如果有的话,有什么机制可以在子alpha值中进行这种更改。

我已经尝试安装事件过滤器并设置setFiltersChildEvents()。未发送PaintEvent s

这不是我自己问题的确切答案,但我想它可以作为初学者。只有QGraphicsEffect::draw成员函数需要被重写(margins_QMargins成员变量):

void FadeEdgesEffect::draw(QPainter* painter)
{
  QLinearGradient lg;
  lg.setColorAt(qreal(0), QColor(0, 0, 0, 0));
  lg.setColorAt(qreal(1), QColor(0, 0, 0, 255));
  qreal const width(boundingRect().width());
  qreal const height(boundingRect().height());
  QPoint offset;
  QPixmap pixmap(sourcePixmap(Qt::LogicalCoordinates, &offset));
  {
    QPainter p(&pixmap);
    p.setCompositionMode(QPainter::CompositionMode_DestinationIn);
    if (margins_.left())
    {
      lg.setStart(qreal(0), qreal(0));
      lg.setFinalStop(margins_.left(), qreal(0));
      p.fillRect(QRectF(0, 0, margins_.left(), height), lg);
    }
    // else do nothing
    if (margins_.right())
    {
      lg.setStart(qreal(width), qreal(0));
      lg.setFinalStop(width - margins_.right(), qreal(0));
      p.fillRect(QRectF(width - margins_.right(),
        0, margins_.right(), height), lg);
    }
    // else do nothing
    if (margins_.bottom())
    {
      lg.setStart(qreal(0), height);
      lg.setFinalStop(qreal(0), height - margins_.top());
      p.fillRect(QRectF(0, height - margins_.bottom(),
        width, margins_.bottom()), lg);
    }
    // else do nothing
    if (margins_.top())
    {
      lg.setStart(qreal(0), qreal(0));
      lg.setFinalStop(0, margins_.top());
      p.fillRect(QRectF(0, 0, width, margins_.top()), lg);
    }
    // else do nothing
  }
  painter->drawPixmap(offset, pixmap);
}