【问题标题】:How to use a mask with QPainter?如何在 QPainter 中使用遮罩?
【发布时间】:2011-11-24 06:03:39
【问题描述】:

我有一个从具有透明度的 PNG 加载的形状(蓝色):

然后我用QPainter::drawEllipse在这个形状(红色)上画几个圆圈。

这样的结果有点类似于第三张图片,红色的形状完全覆盖了蓝色的形状:

然而,我希望蓝色形状充当红色形状的遮罩,结果如下:

QPainter 可以做到吗?

【问题讨论】:

    标签: qt mask qpainter


    【解决方案1】:

    这是可能的。假设您将 PNG 加载到 QImage 中,您可以执行以下操作从图像创建蒙版:

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

    请参阅 QImage 中 create*Mask 的其他函数以获取替代方法。

    那么设置painter的剪辑区域就很简单了:

    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);
            }
    };
    

    这会产生如下内容:

    【讨论】:

    • QRegion 没有采用 QPixmap 的构造函数?
    • @PaulKnopf:它有一个采用 QBitmap,并且 QPixmap 可以转换为 QBitmap。
    • @paul-knopf: 你需要#include &lt;QBitmap&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 2015-03-23
    • 2016-11-14
    • 2021-03-28
    • 2014-02-01
    • 2012-11-06
    相关资源
    最近更新 更多