首页 > 解决方案 > 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 图像,它们似乎可以工作。不知道这张图片是怎么回事。

标签: c++qtsvg

解决方案


OP 在他的自我回答中提供了正确的解决方法,但没有解释为什么这是必要的。所以,我会介入:

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

QImage::QImage(int width, int height, QImage::Format 格式)

构造具有给定宽度、高度和格式的图像。

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

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

(强调我的。)

未初始化意味着图像像素字节中可能有任何值。如果都是0s,那么 alpha 值也会是0s。这或许可以解释为什么什么都没有出现。

现在,附加说明为什么这可能在调试模式下起作用:

OP明确提到了MSVC。MS 人员试图为调试提供最佳支持,并决定用模式填充每个分配的内存(在调试模式下),例如CD代表“已分配但尚未初始化”。(更多关于这里的信息:SO:在 Visual Studio C++ 中,内存分配表示形式是什么?。)

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

但是,这有一些缺点:未初始化的bool将始终“初始化”到true调试模式(以某种方式),它在发布时具有任意值。→ 可以想象的最糟糕的事故:调试运行但发布偶尔失败。(我最害怕的虫子。)

在 OP 的情况下,它(可能)相似:在调试模式下,图像始终具有浅灰色背景,其不透明度足够高,可以在发布模式下忽略意外的透明度......见上文。(或者,OP 可能会得到一个噪音模式,就像过去午夜后电视上所知的那样。不确定,这是否有助于进一步......)


推荐阅读