使用QGraphicsItem来加载svg实现移动放大缩小

发布于:2024-12-18 ⋅ 阅读:(58) ⋅ 点赞:(0)
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QSvgRenderer>
class SvgGraphicsItem : public QGraphicsItem
{
public:
    SvgGraphicsItem(const QString &svgFilePath, QGraphicsItem *parent = nullptr)
        : QGraphicsItem(parent)
    {
        // 启用项的拖动功能
        setFlag(QGraphicsItem::ItemIsMovable);
        // 使用QSvgRenderer加载SVG文件
        m_renderer = new QSvgRenderer(svgFilePath);
    }

    // 返回项的边界矩形
    QRectF boundingRect() const override 
    {
        //return QRectF(QRect(QPoint(0, 0), m_renderer->defaultSize()));  // 返回SVG的视图框作为边界矩形
        return m_renderer->viewBoxF();
    }

    // 绘制SVG
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override 
    {
        Q_UNUSED(option);
        Q_UNUSED(widget);

        // 使用QSvgRenderer来绘制SVG内容
        m_renderer->render(painter,QRectF(QRect(QPoint(0, 0), m_renderer->defaultSize())));
    }

private:
    QSvgRenderer *m_renderer;  // QSvgRenderer用于加载和渲染SVG
};
class MyGraphicsView : public QGraphicsView 
{
public:
    MyGraphicsView(QGraphicsScene *scene) : QGraphicsView(scene) 
    {

    }

protected:
    // 重写滚轮事件,实现缩放
    void wheelEvent(QWheelEvent *event) override 
    {
        // 使用滚轮进行缩放
        if (event->angleDelta().y() > 0)
            scale(1.2, 1.2);  // 放大
        else
            scale(0.8, 0.8);  // 缩小
    }
};
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    // 创建 QGraphicsScene 和 QGraphicsView
    QGraphicsScene scene;
    MyGraphicsView view(&scene);
    SvgGraphicsItem *svgItem = new SvgGraphicsItem("C:/Users/HEU_W/Downloads/miyao.svg");
    scene.addItem(svgItem);
    // 设置视图
    view.setRenderHint(QPainter::Antialiasing, true); // 启用抗锯齿
    view.setRenderHint(QPainter::SmoothPixmapTransform, true); // 平滑缩放
    view.setRenderHint(QPainter::TextAntialiasing); // 文本抗锯齿
    view.setSceneRect(svgItem->boundingRect());  // 设置视图的显示范围

    // 显示视图
    view.show();

    return app.exec();
}

使用下面的方法可以实现QGraphicsItem的拖动功能
setFlag(QGraphicsItem::ItemIsMovable);
继承QGraphicsView 重写滚轮事件可以实现视图缩放


网站公告

今日签到

点亮在社区的每一天
去签到