赞助

Qt SVG Viewer 查看器

转载:https://www.jb51.net/article/251999.htm

转载:https://download.csdn.net/blog/column/7026229/78623499

转载:https://cloud.tencent.com/developer/article/1775877(BMP、GIF、TIFF、PNG、JPG和SVG格式图像的特点)

工作中没有小事:点石成金,滴水成河,只有认真对待自己所做的一切事情,才能克服万难,取得成功

1.添加QMySvgWidget类

 

image

 QMySvgWidget类继承自QSvgWidget类,主要显示SVG图片

QMySvgWidget.h

#include <QtSvg/QtSvg>
#include <QtSvg/QSvgWidget>
#include <QtSvg/QSvgRenderer>

class QMySvgWidget  : public QSvgWidget
{
    Q_OBJECT

public:
    QMySvgWidget(QWidget *parent);
    ~QMySvgWidget();

public:
    void wheelEvent(QWheelEvent*);//响应鼠标的滚动事件,使SVG图片可以通过鼠标滚动进行缩放
private:
    QSvgRenderer* render;           //用于图片显示尺寸 的 确定
};

QMySvgWidget.cpp

#include "QMySvgWidget.h"

QMySvgWidget::QMySvgWidget(QWidget *parent)
    : QSvgWidget(parent)
{
    //获得本窗体的QSvgRenderer对象
    render = renderer();
}

QMySvgWidget::~QMySvgWidget()
{}

void QMySvgWidget::wheelEvent(QWheelEvent* e)
{
    const double diff = 0.1;//diff的值表示每次滚轮滚动一定的值,图片大小改变的比例
    //用于获取图片显示区的尺寸
    QSize size = render->defaultSize();
    int width = size.width();
    int height = size.height();
    //利用QWheelEvent的相关函数获得滚轮滚动的距离值,通过此值判断滚轮滚动的方向
    //若此值大于0,则表示滚轮向前(远离用户方向)滚动;
    //若此值小于0,则表示滚轮向后(靠近用户方向)滚动;
    //Qt6使用e->angleDelta().y()
    //Qt5请使用e->delta()
    if (e->angleDelta().y() > 0) {
        //对图片的长、宽值进行放大
        width = int(this->width() + this->width() * diff);
        height = int(this->height() + this->height() * diff);
    }
    else {
        //对图片的长、宽值进行缩小
        width = int(this->width() - this->width() * diff);
        height = int(this->height() - this->height() * diff);
    }
    resize(width, height);//重新调整大小
}

2.QSvgWindow类继承自QScrollArea,是一个带滚动条的显示区域

image

QSvgWindow.h

#include <QScrollArea>

class QMySvgWidget;

class QSvgWindow  : public QScrollArea
{
    Q_OBJECT

public:
    QSvgWindow(QWidget *parent);
    ~QSvgWindow();

    void setFile(QString fileName);
    void mousePressEvent(QMouseEvent* e);
    void mouseMoveEvent(QMouseEvent* e);
private:
    QMySvgWidget* svgWidget;
    QPoint mousePressPos;
    QPoint scrollBarValueOnMousePress;
};

QSvgWindow.cpp

#include "QSvgWindow.h"
#include "QMySvgWidget.h"

QSvgWindow::QSvgWindow(QWidget *parent)
    : QScrollArea(parent)
{
    svgWidget = new QMySvgWidget(this);
    setWidget(svgWidget);       //设置滚动条
}

QSvgWindow::~QSvgWindow()
{}

void QSvgWindow::setFile(QString fileName)
{
    //将新的SVG文件加载到svgWidget中显示
    svgWidget->load(fileName);
    //返回渲染器,去显示控件的内容
    QSvgRenderer* render = svgWidget->renderer();
    //使svgWidget窗体按SVG图片的默认尺寸进行显示
    svgWidget->resize(render->defaultSize());
}

void QSvgWindow::mousePressEvent(QMouseEvent* event)
{
    mousePressPos = event->pos();         //记下当前事件位置
    scrollBarValueOnMousePress.rx() = horizontalScrollBar()->value();
    scrollBarValueOnMousePress.ry() = verticalScrollBar()->value();
    //设置事件对象的接受信号,表明事件接受器希望事件,意外事件传到父部件
    event->accept();
}

void QSvgWindow::mouseMoveEvent(QMouseEvent* event)
{
    //对水平滑动条的新位置进行设置
    //新水平滑动条位置 = (滑块当前位置 - 鼠标即时返回的位置)(即:滑块移动位置) + 鼠标之前记下的事件位置
    horizontalScrollBar()->setValue(scrollBarValueOnMousePress.x() - event->pos().x() + mousePressPos.x());
    //对垂直滑动条的新位置进行设置
    verticalScrollBar()->setValue(scrollBarValueOnMousePress.y() - event->pos().y() + mousePressPos.y());
    horizontalScrollBar()->update();
    verticalScrollBar()->update();
    event->accept();
}

3.使用QSvgWindow

QtSvgViewer.h

#include <QtWidgets/QMainWindow>
#include "ui_QtSvgViewer.h"


class QSvgWindow;
class QtSvgViewer : public QMainWindow
{
    Q_OBJECT

public:
    QtSvgViewer(QWidget *parent = nullptr);
    ~QtSvgViewer();

    void createMenu();
public slots:
    void slotOpenFile();
private:
    QSvgWindow* svgWindow;              //用于调用相关函数传递选择的文件名

private:
    Ui::QtSvgViewerClass ui;
};

 

 QtSvgViewer.cpp

#include "QtSvgViewer.h"
#include <QFileDialog>
#include "QSvgwindow.h"

QtSvgViewer::QtSvgViewer(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    setWindowTitle(tr("SVG Viewer"));
    createMenu();
    svgWindow = new QSvgWindow(this);
    setCentralWidget(svgWindow);
}

QtSvgViewer::~QtSvgViewer()
{}

void QtSvgViewer::createMenu()
{
    //添加“文件”菜单条
    QMenu * fileMenu = menuBar()->addMenu(QStringLiteral("预览Svg"));
    QAction * openAct = new QAction(QStringLiteral("打开"), this);
    connect(openAct, SIGNAL(triggered(bool)), this, SLOT(slotOpenFile()));
    //添加"打开"菜单项
    fileMenu->addAction(openAct);
}

void QtSvgViewer::slotOpenFile()
{
    QString name = QFileDialog::getOpenFileName(this, QStringLiteral("打开"), "/", "svg file(*.svg)");
    svgWindow->setFile(name);
}

4.运行效果

image

 

posted @ 2026-09-07 17:22  车臣  阅读(11)  评论(0)    收藏  举报