SVG в Qt: выберите средство отрисовки и проверьте файл
Используйте QSvgWidget или QSvgRenderer для SVG в Qt, проверьте текущую поддержку функций и не путайте масштабируемый исходник с фиксированным растровым изображением в приложении.
На этой странице
- Выберите способ отображения перед правкой SVG
- Попробуйте небольшой исходник перед полной иллюстрацией
- Минимальный пример Qt 6 Widgets
- Проверяйте текущую поддержку вместо предположения о равенстве с браузером
- Замечайте превращение SVG в пиксели в своем процессе
- Проверьте результат перед упрощением всего
- Восстановите исходный оригинал, когда остался только растр
- Частые вопросы
- Источники
Для SVG в приложении Qt Widgets начните с QSvgWidget, если хотите показать рисунок. Используйте QSvgRenderer, если нужно рисовать его на выбранной поверхности. Это различие важно: однократная отрисовка в QImage фиксированного размера оставляет пиксели для отображения, а сохранение SVG позволяет отрисовать его снова в другом размере. Руководство Qt по отрисовке описывает оба способа.
Сначала выберите способ, затем проверьте графику. Браузерный предпросмотр может показать задуманный дизайн, но не доказывает поддержку Qt всех функций файла.
Выберите способ отображения перед правкой SVG
| Ваша задача | Отправная точка | Что проверить |
|---|---|---|
| Показать статичный SVG рядом с другими виджетами | QSvgWidget | Загрузку файла, границы рисунка и пропорции |
| Рисовать в своем виджете или изображении | QSvgRenderer с painter | Размер поверхности и момент отрисовки |
| Редактировать отдельные векторные точки | Редактор графики или отдельная реализация редактирования | Редактируемую исходную геометрию и поведение выделения |
Qt описывает QSvgWidget как виджет отображения SVG и дает доступ к его средству отрисовки через renderer(). Виджет относится к SvgWidgets; его зависимость CMake — Qt6::SvgWidgets. Справка класса здесь полезнее старого примера, который добавляет только общий модуль SVG.
Отображение SVG не создает редактор иллюстраций. Храните отдельный исходный оригинал, если кому-то понадобится переместить лист, изменить угол или перекрасить отдельную деталь.

Попробуйте небольшой исходник перед полной иллюстрацией
Сохраните этот исходный рисунок как leaf.svg. Он использует лист с заливкой, светлую жилку и отдельный коралловый круг:
<svg xmlns="http://www.w3.org/2000/svg" width="160" height="100" viewBox="0 0 160 100">
<path d="M24 78C20 34 56 18 98 26C90 62 58 86 24 78Z" fill="#176b64"/>
<path d="M28 74L78 38" fill="none" stroke="#fff6e8" stroke-width="5"/>
<circle cx="126" cy="26" r="10" fill="#ec785e"/>
</svg>Широкий холст выбран намеренно. Если лист становится высоким и узким, проверьте обработку пропорций перед правкой кривых. Если круг исчезает, проверьте видимые границы и сравните загруженный файл с исходником. Этот небольшой пример дает узнаваемые детали без зависимости от отсечения или эффектов.
Для общего понимания самого файла руководство по формату SVG объясняет различие между векторными фигурами и оболочкой SVG с растровым изображением.
Минимальный пример Qt 6 Widgets
Создайте main.cpp:
#include <QApplication>
#include <QSvgRenderer>
#include <QSvgWidget>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
if (argc != 2)
return 1;
QSvgWidget view;
view.load(QString::fromLocal8Bit(argv[1]));
if (!view.renderer()->isValid())
return 2;
view.renderer()->setAspectRatioMode(Qt::KeepAspectRatio);
view.resize(400, 240);
view.show();
return app.exec();
}Передайте имя файла SVG как аргумент программы, желательно абсолютный путь во время проверки. Код выхода 1 означает, что пример не получил ровно одно имя файла; 2 означает, что средство отрисовки не сообщило о допустимом документе. Эти коды выбраны в примере, а не являются собственным API кодов ошибок Qt.
isValid() проверяет загруженный документ. Это не визуальная приемка. Явная настройка KeepAspectRatio просит средство отрисовки сохранять пропорции; справка QSvgRenderer описывает проверку допустимости и режимы пропорций.
Используйте этот CMakeLists.txt рядом с исходником:
cmake_minimum_required(VERSION 3.16)
project(LeafPreview LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Qt6 REQUIRED COMPONENTS Widgets Svg SvgWidgets)
add_executable(leaf_preview main.cpp)
target_link_libraries(leaf_preview PRIVATE Qt6::Widgets Qt6::Svg Qt6::SvgWidgets)Пример подключает Widgets для приложения, SvgWidgets для виджета отображения и Svg для вызовов средства отрисовки. Qt перечисляет компонент Svg средства отрисовки отдельно от компонента SvgWidgets.
Настройте и соберите его установленным комплектом разработки Qt 6, затем запустите leaf_preview с путем к leaf.svg. Это документированный пример исходного кода; мы не компилировали и не запускали его в нативной среде Qt. Проверьте реальную сборку и графику в целевой системе перед использованием.
Проверяйте текущую поддержку вместо предположения о равенстве с браузером
Современный Qt SVG не ограничен только статическими функциями SVG Tiny. Qt документирует дополнительные элементы начиная с Qt 6.7, разбираемые по умолчанию, с параметром ограничения разбора функциями Tiny. Справка по расширенным функциям перечисляет поддерживаемые дополнения и их ограничения.
Одна конкретная граница — clipPath: та же страница отмечает его как неподдерживаемый. Поэтому файл, зависящий от отсечения, заслуживает проверки исходника, даже если правильно выглядит в браузере. У отдельных масок и фильтров есть документированная поддержка, но она не подтверждает поддержку любого эффекта или настройки экспорта.
Если простой лист работает, а большая иллюстрация отличается, сделайте копию и удаляйте по одной подозрительной функции. Для графики с отсечением рассмотрите создание нужной видимой геометрии в редакторе вместо зависимости от операции отсечения. Сравните полученный силуэт с оригиналом перед заменой исходного файла.
Тексту нужна собственная проверка. Если надпись меняется, выполните руководство по проблемам шрифтов SVG. Превращение надписей в фигуры — дизайнерский компромисс; оно не должно быть первым исправлением неверного имени файла или отсутствующего модуля.
Замечайте превращение SVG в пиксели в своем процессе
Предположим, код один раз отрисовывает лист в небольшой QImage, создает из него pixmap, затем увеличивает pixmap. Увеличение воздействует на растровый результат. Исходник SVG не исчез, но последующая операция отображения уже не запрашивает у него новую отрисовку.
Руководство Qt по отрисовке различает рисование в изображении и рисование в событии paint виджета. Если отображение меняет размер, решите, где нужно заново отрисовать SVG. Не считайте кешированный растр доказательством, что сам исходник не может масштабироваться.
То же различие важно при подготовке набора значков SVG. Сохраняйте согласованные границы исходников, затем оценивайте каждый значок в реальном размере использования. Узнаваемый большой лист все еще может потерять жилку или отдельный круг при маленьком отображении.
Проверьте результат перед упрощением всего
Начните с реально загружаемого файла, а не другого экспорта с похожим именем. Подтвердите появление простого примера, затем сравните рабочую графику в нужном размере и после изменения размера.
Для листа проверьте, что круг остается отдельным, жилка видна, а широкий холст не растягивает рисунок. Это проверки приемки для вашего запуска, а не сообщенные результаты нашего. Если вся область отображения пустая, список проверок пустого SVG поможет отделить невидимую графику и границы рисунка от настройки приложения.
Сохраняйте фотографии или текстурные иллюстрации как растровые ресурсы, если это подходит дизайну. Выбор SVG должен отвечать требованиям к графике; сам по себе он не гарантирует меньший размер файлов, более быструю отрисовку или одинаковый результат разных движков.
Восстановите исходный оригинал, когда остался только растр
Если значок сохранился только в PNG или JPG, процесс преобразования изображения в вектор PerfectVector может помочь подготовить редактируемую SVG-графику перед передачей в Qt. Проверьте силуэт, зазоры и отдельные детали после преобразования, затем проверьте этот SVG выбранным способом Qt. Векторизация подготавливает геометрию; она не добавляет функции средства отрисовки и не превращает виджет отображения в редактор контуров.
Если чистый векторный оригинал уже есть, меняйте его напрямую. Упрощайте копию только когда внимания требует конкретная функция или деталь малого размера, и сохраните более богатый исходник для будущих правок.
Частые вопросы
Использовать QSvgWidget или QSvgRenderer? Используйте QSvgWidget для отображения SVG в интерфейсе Widgets. Используйте QSvgRenderer, когда нужно управлять рисованием на выбранной поверхности, например в собственном виджете или изображении.
Поддерживает ли текущий Qt только SVG Tiny? Qt описывает поддержку статического SVG Tiny и отдельные расширения, введенные в Qt 6.7. Проверяйте текущую справку функций и настроенные параметры вместо предположения о поддержке только Tiny или равенстве с браузером.
Почему SVG может выглядеть размытым после помещения в pixmap? Если сначала он отрисован в растр фиксированного размера, увеличение этого результата масштабирует пиксели. Пересмотрите поверхность отрисовки и то, отрисовывается ли SVG заново в нужном размере.
Доказывает ли допустимая загрузка SVG правильную отрисовку всех деталей? Нет. Проверка допустимости не заменяет визуальную проверку. Сравните границы, пропорции, мелкие детали и поддерживаемые функции в реальном целевом приложении.
Источники
- Qt — Rendering SVG Files — Виджеты отображения, поверхности painter и различие отрисовки виджета и промежуточного растра.
- Qt — QSvgWidget Class — Виджет отображения, доступ к средству отрисовки и зависимость SvgWidgets.
- Qt — QSvgRenderer Class — Зависимость Svg, допустимость документа и настройки пропорций.
- Qt — Extended Features — Современные расширения и явные ограничения функций, включая неподдерживаемые контуры отсечения.
Начните с одного небольшого файла и проверьте его выбранным способом Qt. Если растровую графику нужно восстановить, подготовьте пробный редактируемый SVG, сравните фигуры с исходником и повторите проверки уровня приложения перед заменой ресурса.
Ещё из блога

Текст SVG foreignObject: пропавшие подписи при экспорте
Исправьте подписи SVG, которые видны в браузере, но исчезают при экспорте. Сравните foreignObject с обычным текстом SVG, проверьте пространства имён и сохраните иллюстрацию.

SVG-маркеры QGIS: символы с изменяемыми цветами
Подготовьте SVG-маркер QGIS с параметрами заливки и обводки, настоящим вырезом и фиксированным акцентом. Сохраните обычный оригинал SVG и проверьте копию для приложения.