2011-05-06 117 views
2

我想在Qt-4.7应用程序的菜单和按钮中使用SVG。该图像是通过Linux和Windows平台正确呈现,但是一个讨厌的消息阅读...为什么Qt经常为SVG打印“无法创建图像”?

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. 正如书名,为什么Qt的印刷本,即使正确渲染SVGs什么时候?
  2. 如果不重新编译Qt或其SVG库,我该如何防止Qt打印该文件并拖拽应用程序的输出?

我也在QtCentre forums上发布了这个问题。

回答

3

要#2:您可以通过使用qIntallMsgHandler并编写一个只丢弃该消息的处理程序来阻止qDebug输出。也看到这个问题:How to redirect qDebug, qWarning, qCritical etc output?

+0

这肯定看起来像唯一的选择来抑制qDebug()输出Qt的从自己的可执行文件库本身。凉。 – 2011-05-06 22:55:04

2

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

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

你的结论是他们被正确渲染的标准是什么?也许你可以在文本编辑器中打开SVG文件,并查看其中的发生?

0

我有过类似的问题,我用Adobe Illustrator创建图像,然后保存为SVG。问题是Illustrator中的隐藏层仍然写入SVG文件,但其显示属性设置为“none”。在我的情况下,我“放置”了一个隐藏的文件层 - 如果我创建的背景看起来不错,那么可以了解一下。

这会导致您的图像按照您的说法正确呈现,但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会抱怨缺少“../logo_preview.png”文件。

希望这有助于