QPainter 组合模式示例无法按预期工作

QPainter composition mode example does not work as expected

我对书中示例和我的版本之间的差异感到困惑。 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。 或者是我的手工虫

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

提前致谢!

合成模式适用于透明背景,在你的情况下它不是,所以你必须在绘画之前设置它,为此你可以使用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);