Почему Qt постоянно печатает "не удалось создать изображение" для SVG? - PullRequest
2 голосов
/ 07 мая 2011

Я хотел бы использовать SVG в меню и кнопках вокруг приложения Qt-4.7.Изображения отображаются правильно на платформах Linux и Windows, однако неприятное чтение сообщения ...

couldn't create image from ""

... выводится на консоль, по-видимому, как только одно из этих изображенийзагружен или изменяет состояние (например, выделение или отключение виджета контейнера).В ходе выполнения приложения многие из этих строк выводятся на печать, в результате чего бессмысленный вывод разбирается на приемлемый вывод приложения.

Немного ковыряясь в коде Qt, это, похоже, исходит от svg/qsvghandler.cpp:2680, где строка содержит следующее.

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

Из документации для qDebug можно подумать, что я мог бы заблокировать это, определив QT_NO_DEBUG_OUTPUT во время компиляции, но этобудет блокировать только скомпилированные отладочные вызовы приложения, а не тот, что в SVG-библиотеке Qt.

Так что я думаю, что мой вопрос на самом деле состоит из двух частей:

  1. Как и в заголовке, почемуQt печатать это даже при правильной визуализации SVG?
  2. Без перекомпиляции Qt или его библиотеки SVG, как я могу запретить Qt печатать это и выводить вывод приложения?

У меня также естьразместил этот вопрос на форумах QtCentre .

Ответы [ 3 ]

3 голосов
/ 07 мая 2011

К # 2: Вы можете предотвратить вывод qDebug, используя qIntallMsgHandler и написав обработчик, который просто отбрасывает сообщение.Также смотрите этот вопрос: Как перенаправить вывод qDebug, qWarning, qCritical и т. Д.?

2 голосов
/ 07 мая 2011

Re # 1: я не эксперт по SVG, но из исходного кода Qt, где появляется эта строка, похоже, что Qt пытается загрузить файл изображения, указанный в атрибуте xlink:href. Вывод, который вы видите, может показывать, что либо значение для этого атрибута равно "", либо значение представляет собой набор символов пробела, заключенных в "", которые удаляются вызовом QString.trimmed(), который затем используется как имя файл изображения для загрузки в QImage. Я не могу понять, если имя файла заканчивается пустой строкой или двумя кавычками:)

Мне бы пришлось предположить, что либо у вас есть SVG-файлы, заполненные пустыми строковыми атрибутами xlink:href (возможно, ссылки или имена файлов для текстурных изображений), либо что-то в SVG-файле заставляет Qt неправильно его анализировать. Я бы склонялся к первому.

Каковы ваши критерии для вывода, что они отображаются правильно? Возможно, вы могли бы открыть файлы SVG в текстовом редакторе и посмотреть на xlink:href в нем вхождения?

0 голосов
/ 21 февраля 2015

У меня была похожая проблема, я использовал Adobe Illustrator для создания изображений, а затем сохранил как SVG. Проблема в том, что скрытые слои в Illustrator по-прежнему записываются в файл SVG, но его свойство display установлено в «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".

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...