qml显示SVG图片

#ifndef SVGIMAGE_H
#define SVGIMAGE_H

#include 
#include 

class QSvgRenderer;

class SVGImage : public QQuickPaintedItem
{
    Q_OBJECT

public:
    SVGImage(QQuickItem *parent = nullptr);

    virtual void paint(QPainter *painter) override;

public:
    Q_PROPERTY(QString source READ source WRITE setSource NOTIFY sourceChanged)

    QString source() const { return m_svgSource; }
    void setSource(const QString &src);

signals:
    void sourceChanged();

private:
    QString         m_svgSource;
    QSvgRenderer*   m_svgRender;
    QPixmap         m_pixmap;
};

#endif // SVGIMAGE_H

#include "SVGImage.h"
#include 
#include 
#include 
#include 
#include 

SVGImage::SVGImage(QQuickItem *parent):
    QQuickPaintedItem(parent)
{
    m_svgRender = new QSvgRenderer(this);
}

void SVGImage::paint(QPainter *painter)
{
    qDebug() << __func__ << "()" << m_svgSource;
    qDebug() << QQmlFile::urlToLocalFileOrQrc(m_svgSource);
    m_svgRender->load(QQmlFile::urlToLocalFileOrQrc(m_svgSource));
    QSize size = m_svgRender->defaultSize();

//    QPixmap pixmap(size);
//    pixmap.fill(Qt::transparent);
    QBrush brush(QColor("#007430"));
    painter->setBrush(brush);
    painter->setRenderHints(QPainter::Antialiasing);
    m_svgRender->render(painter);
}

void SVGImage::setSource(const QString &src)
{
    if (m_svgSource != src) {
        m_svgSource = src;
        emit sourceChanged();
    }
}

// 在合适的位置注册一下
qmlRegisterType<SVGImage>("SVGImage", 1, 0, "SVGImage");
import SVGImage 1.0

// 修改宽高即可改变缩放
SVGImage {
    id: svgImage
    width: 24
    height: 24
    anchors.centerIn: parent
    source: "qrc:/zoom_in_24.svg"

    Rectangle {
        anchors.fill: parent
        border.color: "red"
        border.width: 3
        color: Qt.rgba(0, 0, 0, 0)
    }
}

你可能感兴趣的:(c++,qml)