#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 重写滚轮事件可以实现视图缩放