Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.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++ QPaint合成模式示例未按预期工作_C++_Qt_Qpainter - Fatal编程技术网

C++ QPaint合成模式示例未按预期工作

C++ QPaint合成模式示例未按预期工作,c++,qt,qpainter,C++,Qt,Qpainter,我被书中的例子和我的版本的区别所困扰。 Qt版本5.12.0 如示例所示: 从我的输出中可以看出: 首先,目标和源处于/顶部模式的图片不相同。另一件值得注意的事情是,我们可以将矩形视为两层之间的附加层 创建标签的代码: QLabel* lblCreate(const QPainter::CompositionMode& mode){ QLabel* lbl = new QLabel; lbl->setFixedSize(100, 100); QRect

我被书中的例子和我的版本的区别所困扰。 Qt版本5.12.0

如示例所示:

从我的输出中可以看出:

首先,目标和源处于/顶部模式的图片不相同。另一件值得注意的事情是,我们可以将矩形视为两层之间的附加层

创建标签的代码:

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;}
QLabel*lblCreate(const QPainter::CompositionMode&mode){
QLabel*lbl=新的QLabel;
lbl->setFixedSize(100100);
QRect rect(lbl->contentsRect());
油漆工;
//创建第一个图像
QImage sourceImage(rect.size(),QImage::Format_ARGB32_预乘);
painter.begin(&sourceImage);
painter.setRenderHint(QPainter::抗锯齿,true);
画师:挫折(QColor(0,255,0));
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
//画三角形
painter.drawPolygon(QPolygon()addWidget)(新的QLabel(“源”),1,0;
我自己的怀疑是它可能取决于
QImage::Format\u ARGB32\u预乘
。 或者是我的手工虫子

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


Thnx提前!

构图模式在透明背景上工作,在您的情况下,它不是,因此您必须在绘制之前设置它,为此,您可以使用以下方法:

QImage sourceImage(rect.size(),QImage::Format_ARGB32_预乘);
fill(Qt::transparent);
QImage结果图像(rect.size(),QImage::Format_ARGB32_预乘);
resultImage.fill(Qt::透明);

你的图片的Alpha通道怎么样?有吗?试试
lbl->setStyleSheet(“QLabel{background color:transparent;}”)
QImage你正在用未初始化的数据在另一个
QImage
上合成一个
QImage
和一个
QImage
的单位化数据。这不起作用。谢谢!这对我来说是有效的。你能解释一下吗,如果QImage的背景不是透明的,它的默认颜色是什么?对我来说,实际上还不清楚,主要原因是什么,为什么我们要这样做需要在此处使用fill()方法。@Anton阅读:…警告:这将使用未初始化的数据创建QImage。在使用QPainter…绘制图像之前,调用fill()用适当的像素值填充图像。。。
innerLayout_2->addWidget(lblCreate(QPainter::CompositionMode_Source), 0, 0);
innerLayout_2->addWidget(new QLabel("<CENTER>Source</CENTER>"), 1, 0);