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