C++ QPaint合成模式示例未按预期工作
我被书中的例子和我的版本的区别所困扰。 Qt版本5.12.0 如示例所示: 从我的输出中可以看出: 首先,目标和源处于/顶部模式的图片不相同。另一件值得注意的事情是,我们可以将矩形视为两层之间的附加层 创建标签的代码: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
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);