Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用一个QPaint一次绘制多个输出:SVG和QImage_C++_Qt_Svg_Qpainter_Qimage - Fatal编程技术网

C++ 使用一个QPaint一次绘制多个输出:SVG和QImage

C++ 使用一个QPaint一次绘制多个输出:SVG和QImage,c++,qt,svg,qpainter,qimage,C++,Qt,Svg,Qpainter,Qimage,我的Qt应用程序使用QPaint绘制矢量图形。我需要这个图形输出两次,一次作为SVG格式的矢量输出,在这里我使用QSvgGenerator,一次作为像素格式,在这里我使用QImage。 根据我在文档中找到的内容,我可以先绘制SVG,然后将SVG输出转换为Qimage: QPainter painter; QSvgGenerator generator; generator.setSize(QSize(width_, height_)); // more initializations here

我的Qt应用程序使用QPaint绘制矢量图形。我需要这个图形输出两次,一次作为SVG格式的矢量输出,在这里我使用QSvgGenerator,一次作为像素格式,在这里我使用QImage。 根据我在文档中找到的内容,我可以先绘制SVG,然后将SVG输出转换为Qimage:

QPainter painter;
QSvgGenerator generator;
generator.setSize(QSize(width_, height_));
// more initializations here
painter.begin(&generator);
doPaintMyStuff(&painter);
painter.end();
generator.setOutputDevice(...)   // pipe the SVG output to the server
QImage image(width_, height_, QImage::Format_ARGB32_Premultiplied);
QSvgRenderer renderer;
renderer.load(...)                // get the svg output we just generated
painter.begin(&image);
renderer.render(&painter);       // render the vector graphic to pixel
painter.end();
usePixelData(image.constBits()); // pipe the pixel output to the server
或者使用两个不同的后端绘制两次:

QPainter painter;
QSvgGenerator generator;
generator.setSize(QSize(width_, height_));
// more initializations here
QImage image(width_, height_, QImage::Format_ARGB32_Premultiplied);
painter.begin(&generator);
doPaintMyStuff(&painter);
painter.end();
painter.begin(&image);
doPaintMyStuff(&painter);
painter.end();
generator.setOutputDevice(...)   // pipe the SVG output to the server
usePixelData(image.constBits()); // pipe the pixel output to the server
两种解决方案都有效,但对我来说都非常低效,因为我总是画两次相同的场景。后者调用QPainter上的所有函数两次,前者通过重新跟踪我刚才生成的SVG输出再次绘制所有操作


有没有一种方法可以将多个后端附加到一个QPainter上,从而只对整个场景进行一次绘制?

我认为你无法从盒子中得到你想要的东西。您可以深入研究painter的私有实现,并想出一种只做一次的方法——生成每个向量painter组件,并将其光栅化到另一个painter设备,然后移动到下一个,但这可能并不简单,也不值得


只需描述目前为止您拥有的两个解决方案,并坚持使用更快的解决方案,看起来第一个解决方案可能会更有效率。

正是我所担心的。无论如何,谢谢。@Philipp-节省CPU时间的唯一方法是,您只能为每个基本体的绘图创建一次几何体,然后为SVG和光栅化使用相同的几何体。但是,嘿,去它两次可能看起来是一种浪费-但如果它仍然足够快-谁在乎,它的机器出汗,而不是你钻研QT的内部。从DOCs:如果你需要绘制一个复杂的形状,特别是如果你需要重复这样做,考虑创建一个QPaTrPATH,并使用DavaPrPult绘制它。