使用QPainter确定在绘制时QImage的哪些像素被更改

时间:2014-03-12 21:54:52

标签: c++ qt qpainter qimage

我有一个类Paintable能够使用QPainter作为参数绘制自己:

class Paintable
{
public:
    virtual void paint(QPainter*) = 0;
};

此类的实例正在单个QImage上绘制:

QImage paint(const std::vector<Paintable*>& paintables) {
    QImage result;
    QPainter p(&result);
    for(int i = 0; i < paintables.size(); ++i) {
        paintables[i]->paint(&p);
    }
    return result;
}

我想要实现的是,函数paint也可以形成一个大小等于result图像大小的矩阵,其中每个单元格都包含一个指向Paintable的指针,该指针绘制了相应的像素在result图像中(类似于z-buffer)。

如果QPainter的绘制方法以某种方式告诉我在最后一次绘制操作期间QPaintDevice的哪些像素被更改,则可以轻松实现。有什么想法怎么做?我应该创建派生自QPaintDevice还是QPaintEngine

的类

我正在使用Qt 4.6.4。

感谢。

1 个答案:

答案 0 :(得分:3)

也许不是将所有的Paintables绘制到同一个QImage上,而是将每个绘制到一个临时的空白QImage上 - 即将所有像素设置为RGBA =(0,0,0,0)的QImage。这样,在给定的Paintable的paint()方法返回之后,您知道QImage中现在不透明的任何像素都必须由该Paintable对象绘制。然后,您可以根据该信息更新您自己的z-buffer数据结构,然后将QImage drawImage()转换为单独的“accum QImage”(假设您还需要合成结果),再次清除临时QImage,以及必要时重复。