Kalombyr
@Kalombyr

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

Здравствуйте.
Интерфейс на QML, хочется иметь возможность максимально нативно встраивать и взаимодействовать с элементами SVG.
К примеру, перекрасить отдельные элементы внутри SVG в реальном времени. переместить, отловить клик по ним и т.д.
На виджетах есть специальный класс, который отвечает за рендеринг и прочее, а вот на qml, кроме как отображения через "Image" ничего не нашёл.
  • Вопрос задан
  • 376 просмотров
Решения вопроса 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
Перекрасить изображение целиком ещё реально, остальное стандартными средствами сделать не получится.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы