渲染到位图,我必须创建一个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
答案 0 :(得分:2)
您可以使用以下语法重复使用QPainter
:
QPainter painter;
painter.begin( &img1 );
...
painter.begin( &img2 );
...
但是,您只能为一个QPainter
使用一个QPaintDevice
(在这种情况下是图片)。
答案 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(...)函数。