C++ 确定在使用QPainter进行绘制时QImage的哪些像素发生了更改

C++ 确定在使用QPainter进行绘制时QImage的哪些像素发生了更改,c++,qt,qpainter,qimage,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

我有一个类
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;
}
QImage油漆(const std::vector&paintables){
QImage结果;
QPainter p(和结果);
对于(int i=0;i油漆和p;
}
返回结果;
}
我想要实现的是,函数
paint
还可以形成一个大小等于
result
图像大小的矩阵,其中每个单元格都包含一个指向
Paintable
的指针,该指针在
result
图像中绘制了相应的像素(类似于z-buffer)

如果
QPainter
的绘制方法以某种方式让我知道上次绘制操作期间
QPaintDevice
的哪些像素发生了更改,则可以轻松实现。你知道怎么做吗?我应该创建从
QPaintDevice
QPaintEngine
派生的类吗

我正在使用Qt4.6.4


谢谢。

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

这也是我想到的第一个想法。但我想这样的解决方案会带来巨大的开销。对于高分辨率结果图像,分析每个临时图像可能需要很多时间。但是,如果QPainter或QImage能够提供更多关于使用/使用它们进行绘制的信息,那么就不会有额外的开销。如果您可以为每个可绘制对象指定其唯一的颜色,并保证它只使用该颜色进行绘制,然后你可以让他们都画到同一个QImage,并在最后使用QColor->Paintable贴图从像素中得到结果。。。不知道这是不是一个合理的限制。。。。如果你确实需要多种颜色,你可以做两次;一个用于每个可绘制的“z缓冲区绘制”(如前一条注释中所述)的单色,然后第二次传递到启用了实际颜色的第二个QImage。