[英]can I reuse the QPainter?
渲染到位图,我必须创建一个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
您可以使用以下语法重用QPainter
:
QPainter painter;
painter.begin( &img1 );
...
painter.begin( &img2 );
...
但是您只能将一个QPainter
用于一个QPaintDevice
(在本例中为图像)。
似乎QObject和从其派生的类以及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发布他的答案一样,我想我更喜欢那个答案。
您无需编写此代码:
QPainter * painter =新的QPainter(&img);
您可以这样写:
QPainter painter(&img);
这样,您就不必考虑删除对象了。
是的,所有QObject派生类都有私有副本构造函数。 您可以在此处了解原因。
我认为您不必担心QImage的重用。 您可以实例化一个新实例,并使用QPainter类的being(...)函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.