Qt在"debug"模式下正确渲染此SVG,但在"release"
Qt renders this SVG correctly in "debug" mode but not in "release"
我遇到了这个奇怪的问题,当我为调试构建并针对调试dlls(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图像,它们似乎有效。不知道这张图片是怎么回事。
OP在他的自我回答中提供了正确的修复,但没有解释为什么这是必要的。所以,我会介入:
Qt文档关于QImage::QImage()
:
:Q测量仪(整数宽度,整数高度,QImage::格式格式)
构建具有给定宽度、高度和格式的图像。
如果无法分配内存,将返回空图像。
警告:这将创建一个包含未初始化数据的 QImage。调用 fill() 以在图像上绘制之前,使用适当的像素值填充图像。
(强调我的。
未初始化表示图像像素字节中可能存在任何值。如果全部为0
s,则 alpha 值也将0
s。这也许可以解释为什么什么都没有出现。
现在,一个额外的说明,为什么这可能在调试模式下工作:
OP明确提到了MSVC。MS 人员试图为调试提供最佳支持,并决定用诸如CD
代表"已分配但尚未初始化"。(更多关于这一点:SO:在Visual Studio C++中,内存分配表示形式是什么?
有时,这真的很有帮助。将此位模式解释为float
或double
会产生非常奇怪的数字(通过一点经验很容易识别),并且十六进制视图中的整数值变得非常明显。
但是,这有一些缺点:未初始化的bool
将始终"初始化"以在调试模式下(以某种方式)true
,其中它在发布中具有任意值。 → 可以想象的最糟糕的事故:调试运行,但发布偶尔失败。(我最害怕的虫子。
在OP的情况下,它(可能)相似:在调试模式下,图像始终具有浅灰色背景,不透明度高到足以忽略释放模式下意外的透明度...见上文。(或者,OP可以得到一种噪音模式,就像过去午夜之后从电视上知道的那样。不确定,这是否进一步帮助...
所以很明显,如果我在调试和发布中都按预期设置背景。
#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;
}
- 代码在main()中运行,但在函数中出现错误
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 换位表导致测试失败(但在游戏中运行良好)
- 库标题在标题中不可见,但在 cmake build 下.cpp文件中完全可见.为什么?
- 树莓上的 Libtorch 无法加载 pt 文件,但在 ubuntu 上工作
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- 编译在我的 Mac 上工作,但在集群 (Linux) 上不起作用
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 我的代码运行良好,但在游戏循环中中断
- C++ assigment std::list:<typename>:itrator 在 main 中工作,但在方法中它不起作用
- C++代码在台式机上工作正常,但在笔记本电脑上则不行
- 实现 DFS 在较短的输入下工作正常,但在较大的输入下会抛出分段错误
- 点云库在VS 2019中不起作用,但在VS 2017中确实有效
- C++ Python 模块在 Blender 中崩溃,但在 Python 控制台中不会崩溃
- 分段 Linux Ubuntu 中的 g++ 错误,但在 Windows 中的 g++/MingW 中,在 C++ 中打
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- Qt在"debug"模式下正确渲染此SVG,但在"release"