我可以重复使用QPainter吗?

时间:2015-04-23 20:19:28

标签: c++ image qt

渲染到位图,我必须创建一个QPainter。如果我必须将多个区域渲染到多个位图,我该如何重置QPainter?

QImage img1(scene1.sceneRect().size().toSize(), QImage::Format_ARGB32_Premultiplied);
img1.fill(Qt::color0);
QPainter painter1(&img1);
painter1.setRenderHint(QPainter::Antialiasing);
scene1.render(&painter1);
painter1.end();

QImage img2(scene2.sceneRect().size().toSize(), QImage::Format_ARGB32_Premultiplied);
img2.fill(Qt::color0);
QPainter painter2(&img2);
painter2.setRenderHint(QPainter::Antialiasing);
scene2.render(&painter2);
painter2.end();

如何重复使用画家?我是否通过为每个场景/图像创建新的QPainter来获得性能提升/更高的内存使用量?

尝试

QImage img(scene1.sceneRect().size().toSize(), QImage::Format_ARGB32_Premultiplied);
img.fill(Qt::color0);
QPainter painter(&img);
painter.setRenderHint(QPainter::Antialiasing);
scene1.render(&painter);
painter.end();
img.save("img.png");

img = QImage(scene2.sceneRect().size().toSize(), QImage::Format_ARGB32_Premultiplied);
img.fill(Qt::color0);
painter = QPainter(&img);
painter.setRenderHint(QPainter::Antialiasing);
scene2.render(&painter);
painter.end();

我收到类型错误

error: 'QPainter& QPainter::operator=(const QPainter&)' is private

4 个答案:

答案 0 :(得分:2)

您可以使用以下语法重复使用QPainter

QPainter painter;

painter.begin( &img1 );
...
painter.begin( &img2 );
...

但是,您只能为一个QPainter使用一个QPaintDevice(在这种情况下是图片)。

Read this.

答案 1 :(得分:0)

看来,从它派生的QObject和Classes,以及QPainter和其他类,都有私有构造函数(???为什么)

因此...

QImage img(scene1.sceneRect().size().toSize(), QImage::Format_ARGB32_Premultiplied);
img.fill(Qt::color0);
QPainter* painter = new QPainter(&img);
painter->setRenderHint(QPainter::Antialiasing);
scene1.render(painter);
painter->end();
img.save("img.png");

img = QImage(scene2.sceneRect().size().toSize(), QImage::Format_ARGB32_Premultiplied);
img.fill(Qt::color0);
painter = new QPainter(&img);
painter->setRenderHint(QPainter::Antialiasing);
scene2.render(painter);
painter->end();

delete painter;

我正在写这篇文章,因为vizhanyolajos发布了他的答案,我想我更喜欢这个答案。

答案 2 :(得分:0)

你不需要写这个:

QPainter * painter = new QPainter(& img);

你可以写这个:

QPainter画家(& img);

有了这个,你不必考虑删除obejct。

是的,所有QObject派生类都有私有拷贝构造函数。 You can read about the reasons here.

答案 3 :(得分:0)

我认为您不必担心重复使用QImage。您可以实例化一个新实例并使用QPainter类的being(...)函数。