qt关于两张图片重叠显示

方法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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值