Qt在“调试”模式下正确渲染此SVG,但在“发布”模式下不正确

时间:2019-04-28 23:08:07

标签: c++ qt svg

我遇到了这个怪异的问题,当我进行调试并针对调试dll(Qt 5.12.2,开放源代码)进行链接时,我得到了预期的渲染。

当我为发布而构建并针对发布dll进行链接时,映像完全空白。该程序是从MSVC运行的,因此应正确设置dll路径。有人知道怎么回事吗?

#include <QApplication>
#include <QSvgRenderer>
#include <QPainter>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //https://commons.wikimedia.org/wiki/File:USAF-1951.svg
    QSvgRenderer renderer(QString("USAF-1951.svg"));
    QImage image(512, 512, QImage::Format_Grayscale8);
    QPainter painter(&image);
    renderer.render(&painter);
    image.save("USAF-1951.bmp");
    return 0;
}

我尝试了其他一些SVG图像,它们似乎可以正常工作。不知道这张图片怎么了。

2 个答案:

答案 0 :(得分:1)

显然,如果我按调试和发行版中的预期设置背景,那么

#include <QApplication>
#include <QSvgRenderer>
#include <QPainter>
//https://stackoverflow.com/questions/55895293/qt-renders-this-svg-correctly-in-debug-mode-but-not-in-release
int main(int argc, char *argv[])
{
    //https://commons.wikimedia.org/wiki/File:USAF-1951.svg
    QApplication a(argc, argv);
    QSvgRenderer renderer(QString("USAF-1951.svg"));
    QImage image(512, 512, QImage::Format_Grayscale8);
    image.fill(255);//<- Need to set background
    QPainter painter(&image);
    renderer.render(&painter);
    image.save("Test.bmp");
    return 0;
}

答案 1 :(得分:1)

OP在他的self-answer中提供了正确的解决方案,但是没有解释为什么这样做是必要的。因此,我将介入:

Qt文档。关于QImage::QImage()

  

QImage::QImage(int width, int height, QImage::Format format)

     

以给定的宽度,高度和格式构造图像。

     

如果无法分配内存,将返回空图像。

     

警告:这将创建带有未初始化数据的QImage。调用fill(),以在使用QPainter绘制图像之前,用适当的像素值填充图像。

(强调我的。)

未初始化表示图像像素字节中可能有任何值。如果全部为0,则alpha值也将为0。那可以解释为什么什么都没出现。

现在,要另外说明为什么它可能在调试模式下起作用:

OP明确提到了MSVC。 MS专家们试图为调试提供最好的支持,并决定使用诸如的模式填充每个分配的内存(在调试模式下)。 CD代表“已分配但尚未初始化”。 (有关更多信息,请访问SO: In Visual Studio C++, what are the memory allocation representations?。)

有时候,这确实很有帮助。将此位模式解释为floatdouble会产生非常奇怪的数字(有一点经验就很容易识别),并且十六进制视图中的整数值变得非常明显。

但是,这样做有一些缺点:未初始化的bool将始终在调试模式下(以某种方式)被“初始化”为true,在释放模式下它具有任意值。 →可以想象的最严重的事故:调试运行,但偶尔会释放失败。 (我最害怕的错误。)

在OP的情况下,它(可能)是相似的:在调试模式下,图像始终具有浅灰色背景,并且具有不透明度,该透明度足以在释放模式下忽略意外的透明度...参见上文。 (或者,OP可能会像过去午夜过后那样从电视上获得噪声模式。不确定是否进一步帮助了...)