方法1:在paintEvent函数中
//在tabel中或者再widget的paintEvent事件中
QImage *imageA = new QImage(imageAfile);
QImage *imageB = new QImage(imageBfile);
QPainter painter(this); //新建画板
painter.setCompositionMode(QPainter::CompositionMode_SourceOver); //设置重叠效果
painter.begin(imageA);
painter.drawImage(0,0, *imageA);
painter.end();
painter.begin(this);
painter.drawImage(0,0, *imageB);
painter.end();
delete imageB;
delete image;
方法2:在image上再叠一张图
QImage *imageA = new QImage(imageAfile);
QImage *imageB = new QImage(imageBfile);
QPainter imagepainter(imageA ); //新建画板
imagepainter.setCompositionMode(QPainter::CompositionMode_SourceOver); //设置重叠效果
imagepainter.drawImage(0,0, *imageB);
imagepainter.end();
//imageA 就是重叠后得到的图片
方法3:自己操作像素点实现单一颜色替换重叠(由于用for循环对颜色判断,重叠会很粗超,复杂的图不建议用)
//白色部分为后叠上去图片的内容
QImage *imageA = new QImage(imageAfile);
QImage *imageB = new QImage(imageBfile);
QColor color(255,255,255); //白色
int i = 0;
int j = 0;
for(i = 0; i<w; i++)
{
for(j = 0; j<h; j++)
{
if(imageA ->pixelColor(i,j) == color)
{
imageA ->setPixelColor(i,j,imageB->pixelColor(i,j));
}
}
}
//imageA 为最后要的图片
设置重叠效果的参数如下:
出现错误提示:
QPaintDevice: Cannot destroy paint device that is being painted
pure virtual method called
在使用QPainter painter(&Image);Image当画板画图的时候如果Image是new出来的,那么在delete的时候可能会出现上面的错误。
不成熟的解决办法:Image创建的时候不用指针。
Image创建后为空,这时候是不能够用来当作画板的,
会出现错误提示:
QPainter::begin: Paint device returned engine == 0, type: 3 (注:type:0x02代表了Pixmap,0x03代表了Image)
不成熟的解决办法:Image加载一张透明图片,scaled设置成自己想要的大小。
不加载图片直接scaled会出现错误提示:QImage::scaled: Image is a null image
//使用QPainter(&Image)
QImage Image(":/0.png");
Image = Image.scaled(300,200,Qt::IgnoreAspectRatio);
QPainter painter (&Image);
QImage ImageAA(tr(":/1.png");
QRectF ImageRet(50,50, 200,100);
QRectF ImageAARet(0,0, 200,100);
painter .drawImage(ImageRet,ImageAA,ImageAARet);