2011-09-24 127 views
11

我从PNG装有透明的形状(蓝色):如何在QPainter上使用遮罩?

enter image description here

然后,我对这个形状上绘制几个圈(红色)与QPainter::drawEllipse

enter image description here

的这个结果有点类似于第三画面与红色形状完全覆盖蓝色:

enter image description here

什么,但是我想是蓝色形状充当红色面具,结果如下:

enter image description here

QPainter可以做到吗?

回答

20

这是可能的。假设你加载你的PNG成QImage的,你可以做这样的事情,从你的图像创建蒙版:

QImage img("your.png"); 
QPixmap mask = QPixmap::fromImage(img.createAlphaMask()); 

见对方在QImage的create*Mask功能替代品。

然后,它的设置画家的剪辑区域的一个简单的问题:

QPainter p(this); 
p.setClipRegion(QRegion(mask)); 

这是一个愚蠢的演示(不要使用代码-,则图像加载,面具和地区建立应缓存,他们是潜在的昂贵):

#include <QtGui> 

class W: public QWidget 
{ 
    Q_OBJECT 
    public: 
     W(): QWidget(0) { } 

    protected: 
     void paintEvent(QPaintEvent *) 
     { 
      QPainter p(this); 
      QImage img("../back.png"); 
      QPixmap mask = QPixmap::fromImage(img.createAlphaMask()); 

      // draw the original image on the right 
      p.drawImage(300, 0, img); 

      // draw some ellipses in the middle 
      p.setBrush(Qt::red); 
      for (int i=0; i<100; i+=10) 
       p.drawEllipse(i+150, i, 20, 70); 

      // and do the same thing, but with the mask active 
      p.setClipRegion(QRegion(mask)); 
      for (int i=0; i<100; i+=10) 
       p.drawEllipse(i, i, 20, 70); 
     } 
}; 

将会产生这样的:对于有用的示例代码 enter image description here

+0

非常感谢和+1 。 –