【问题标题】:QPainter composition mode example does not work as expectedQPainter 合成模式示例无法按预期工作
【发布时间】:2019-07-26 07:26:19
【问题描述】:

我对本书示例和我的版本的区别感到困惑。 Qt 版本 5.12.0

如示例所示:

从我的输出中可以看出:

首先,目标和源 In/Atop 模式的图片不同。而且,另一个值得注意的事情是,我们可以将矩形视为两个之间的附加层。

创建标签的代码:

QLabel* lblCreate(const QPainter::CompositionMode& mode){
    QLabel* lbl = new QLabel;
    lbl->setFixedSize(100, 100);

    QRect rect(lbl->contentsRect());
    QPainter painter;
    // create first image
    QImage sourceImage(rect.size(), QImage::Format_ARGB32_Premultiplied);
    painter.begin(&sourceImage);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setBrush(QColor(0, 255, 0));
    painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
    // draw triangle
    painter.drawPolygon(QPolygon() << rect.bottomLeft()
                                   << QPoint(rect.center().x(), 0)
                                   << rect.bottomRight());
    painter.end();
    // create second image
    QImage resultImage(rect.size(), QImage::Format_ARGB32_Premultiplied);
    painter.begin(&resultImage);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setPen(QPen(QColor(0, 255, 0), 4));
    painter.setBrush(QColor(255, 0, 0));
    // draw circle
    painter.drawEllipse(rect);
    painter.setCompositionMode(mode);
    painter.drawImage(rect, sourceImage);
   painter.end();

    lbl->setPixmap(QPixmap::fromImage(resultImage));
    return lbl;}

它是如何在 main.cpp 中创建的:

innerLayout_2->addWidget(lblCreate(QPainter::CompositionMode_Source), 0, 0);
innerLayout_2->addWidget(new QLabel("<CENTER>Source</CENTER>"), 1, 0);

我自己的怀疑是它可能取决于QImage::Format_ARGB32_Premultiplied。 或者是我的手工虫子。

无论如何,如果有任何想法,我将不胜感激。

提前谢谢!

【问题讨论】:

  • 图片的 Alpha 通道怎么样。有吗?
  • 试试lbl-&gt;setStyleSheet("QLabel{ background-color: transparent;}");
  • 呃,您正在将带有未初始化数据的 QImage 与另一个带有未初始化数据的 QImage 合成。那是行不通的。

标签: c++ qt qpainter


【解决方案1】:

合成模式适用于透明背景,在你的情况下它不是,所以你必须在绘画之前设置它,为此你可以使用fill()方法:

QImage sourceImage(rect.size(), QImage::Format_ARGB32_Premultiplied);
sourceImage.fill(Qt::transparent);

QImage resultImage(rect.size(), QImage::Format_ARGB32_Premultiplied);
resultImage.fill(Qt::transparent);

【讨论】:

  • 谢谢!这对我有用。你能简单解释一下,如果 QImage 的背景不透明,它的默认颜色是什么?对我来说,其实并不清楚,主要原因是什么,为什么我们需要在这里使用 fill() 方法。
  • @Anton 读取了docs... 警告:这将创建一个带有未初始化数据的 QImage。在使用 QPainter 绘制图像之前,调用 fill() 以使用适当的像素值填充图像。 ...
猜你喜欢
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多