Kalombyr
@Kalombyr

Как в QML вывести svg с возможностью взаимодействия и стилизации?

Здравствуйте.
Интерфейс на QML, хочется иметь возможность максимально нативно встраивать и взаимодействовать с элементами SVG.
К примеру, перекрасить отдельные элементы внутри SVG в реальном времени. переместить, отловить клик по ним и т.д.
На виджетах есть специальный класс, который отвечает за рендеринг и прочее, а вот на qml, кроме как отображения через "Image" ничего не нашёл.
  • Вопрос задан
  • 324 просмотра
Решения вопроса 1
PavelK
@PavelK
Тынц: https://doc.qt.io/qt-5/qml-qtquick-shapes-shape.html (Через PathSvg можете вывести непосредственно сам путь из svg "" .
Анимировать/изменять/взаимодействовать можно относительно легко.

Но тут, как обычно, есть много НО:
1. Вам придётся все стили: обводку, заливку, градиенты прописывать вручную у Shape (как в примере по ссылке)
2. Взаимодействие - на Shape целиком. Нужно на отдельный путь - извольте его в отдельный Shape засунуть
3. ТОРРРМОЗЗЗа, т.к. для ровности и плавности нужно выставлять layer.samples: 16 (минимум). Особенно заметно, если планируете под мобилки. Как статичный интерфейс ещё потянет, если Вы вдруг собрались его делать.
4. Пляски с маштабированием и размерами (У Shape scale появился только с 5.12 вроде)
5. Если у путей стоит какой transform (Иллюстратор его любит выставлять где не приколочено), то либо его то же прописываете (и увеличиваете тормоза), либо сразу применяете к path.d, но для этого придётся писать свой парсер (т.к. трансформации могут быть и на группе то же и на svg целиком), причём достаточно нефиговый - по себе знаю :D
6. Далеко не все возможности SVG реализованы в явном виде. Некоторые поддаются "костылянию" (через ShaderEffects, либо через написание собственных фрагментных шейдеров в крайнем случае. Например - clipPath придётся делать через OpacityMask либо бить дизайнера, что бы обрезал сразу), что опять же увеличивает тормоза.

Опишите для чего именно Вам нужно, подскажу конкретнее куда копать. Может проще вообще в сторону наследования от QQuciPaintedItem и всю работу доверить QSvgRenderer.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Zifix
@Zifix Куратор тега Qt
Barbatum
Перекрасить изображение целиком ещё реально, остальное стандартными средствами сделать не получится.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы