为什么Qt不断为SVG打印“无法创建图像”?

时间:2011-05-06 20:11:33

标签: qt qt4 svg

我想在Qt-4.7应用程序周围的菜单和按钮中使用SVG。这些图像在linux和Windows平台上正确呈现,但这是令人讨厌的消息......

couldn't create image from ""

只要其中一个图像被加载或更改状态(如突出显示或禁用其容器小部件),

...就会打印到控制台。在应用程序运行过程中,许多这些行被打印出来,在合理的应用程序输出周围留下了许多无意义的输出。

稍微探索一下Qt代码,这似乎来自svg/qsvghandler.cpp:2680,其中该行包含以下内容。

qDebug()<<"couldn't create image from "<<filename;

qDebug的文档中,您可以认为我可以通过在编译时定义QT_NO_DEBUG_OUTPUT来阻止它,但这只会阻止应用程序的编译调试调用,而不是Qt的SVG库中的调用。

所以我想我的问题实际上是双重的:

  1. 在标题中,为什么即使正确渲染SVG,Qt也会打印出来?
  2. 如果不重新编译Qt或其SVG库,如何阻止Qt打印此文件并暂停应用程序的输出?
  3. 我也在QtCentre forums上发布了这个问题。

3 个答案:

答案 0 :(得分:3)

To#2:您可以通过使用qIntallMsgHandler并编写仅丢弃该消息的处理程序来阻止qDebug输出。另请参阅此问题:How to redirect qDebug, qWarning, qCritical etc output?

答案 1 :(得分:2)

Re#1:我不是SVG的专家,但是从出现该行的Qt源代码中,看起来Qt正在尝试加载xlink:href属性中引用的图像文件。您看到的输出似乎表明该属性的值为“”,或者该值是一串用“”括起来的空白字符,通过调用QString.trimmed()将其删除,然后将其用作要加载到QImage中的图像文件的名称。我无法辨别文件名是以空字符串还是两个引号结束:)

我不得不猜测你所拥有的SVG文件都填充了空字符串xlink:href属性(可能是纹理图像的链接或文件名),或者有一些关于SVG文件的内容导致Qt错误地解析它。我倾向于前者。

您认为正确呈现它们的标准是什么?也许您可以在文本编辑器中打开SVG文件并查看其中的xlink:href个出现?

答案 2 :(得分:0)

我有类似的问题,我使用Adobe Illustrator创建图像,然后保存为SVG。问题是Illustrator中的隐藏层仍然会写入SVG文件,但其显示属性设置为&#34; none&#34;。在我的例子中,我放置了一个文件的隐藏层&#34;放置&#34; - 了解我创建的背景是否正常。

这会导致您的图像正确渲染,但是Qt抱怨SVG文件中缺少不可见的图层。如果您在文本查看器中打开SVG文件,您可能会发现隐藏层看起来像这样:

 <g id="bglogo_x5F_splash" style="display:none;">
    <image style="display:inline;overflow:visible;" width="1740" height="438" xlink:href="../logo_preview.png"  transform="matrix(1 0 0 1 154 409)">
    </image>
</g>

Qt会抱怨失踪&#34; ../ logo_preview.png&#34;文件。

希望这有帮助