QT_SVG格式图片浏览器

来源:互联网 发布:简谱大师 mac 编辑:程序博客网 时间:2024/05/22 21:41

显示效果如图(放大超过窗口大小时, 可以通过滚动条拖曳查看图片)

1.

2.  (如图,可以任意放大,而不失真)

源代码如下: 

注: 1.在实现代码前 需要现在工程文件“.pro”中加入 QT += svg

     2.新建项目“SVGTest”,基类选择“QMainWindow", 类名默认---实现主窗口区域

     3.新建c++Class文件“SVGWindow”,基类输入“QScrollArea"(手工添加),类名为"SvgWindow"--实现一个带滚动条显示区域

      4.新建c++Class文件 “SvgWidget”,基类输入“QSvgWidget”(手工添加), 类名为“SVGWidget”--实现具体的SVG图片显示工作

//svgwidget.h

复制代码
 1 /*** 2  * 实现显示SVG图片的函数所在的文件. 3  */ 4 #ifndef SVGWIDGET_H 5 #define SVGWIDGET_H 6  7 #include <QtSvg/QtSvg> 8 #include <QtSvg/QSvgWidget> 9 #include <QtSvg/QSvgRenderer>10 11 class SvgWidget : public QSvgWidget12 {13     Q_OBJECT14 public:15     SvgWidget(QWidget *parent = 0);16     //响应鼠标的滚动事件,使SVG图片能够通过鼠标滚轮的 滚动 进行 缩放17     void wheelEvent (QWheelEvent *);18 private:19     //渲染器20     QSvgRenderer *render;           //用于图片显示尺寸 的 确定21 };22 23 #endif // SVGWIDGET_H
复制代码

//svgwidget.cpp

复制代码
 1 #include "svgwidget.h" 2  3 SvgWidget::SvgWidget(QWidget *parent) 4     : QSvgWidget(parent) 5 { 6     //获得本窗体的QSvgRenderer对象 7     render = renderer (); 8 } 9 10 //滚轮响应事件,使SVG图片能够鼠标滚动滑轮进行缩放11 void SvgWidget::wheelEvent (QWheelEvent *e)12 {13     //diff的值表示每次滚轮滑动一定的值,图片大小改变的比例14     const double diff = 0.1;15     /***16      * 下面三行代码: 用于获取图片显示区的尺寸大小,以便进行下一步的缩放操作17      */18     QSize size = render->defaultSize ();19     int width = size.width ();20     int height = size.height ();21     /***22      * 利用QWheelEvent的delta()函数获得滚轮的距离值,通过此值来判断滚轮滚动的方向23      * delta() > 0 , 则表示滚轮向前(远离用户方向); delta() < 0, 则表示向后滚动24      * (Ps: 鼠标滚动事件,滚轮每滚动1°, 相当于移动8°;而常见的滚轮鼠标拨动一下滚动角度为15°25      * 因此,滚轮拨动一下相当于移动了 120(=15*8)26      */27     if (e->delta () > 0)28     {29         //对图片的长, 宽值进行处理, 放大一定的比例30         width = int(this->width () + this->width ()*diff);31         height = int(this->height () + this->height ()*diff);32     }33     else34     {35         //对图片的长,宽进行处理,缩小一定的比例36         width = int(this->width () - this->width ()*diff);37         height = int(this->height () - this->height ()*diff);38     }39     //利用新的长,宽值对图片进行resize()操作40     resize (width, height);41 42 }
复制代码

//svgwindow.h

复制代码
 1 /* 2  * 实现一个带滚动条显示区域的函数所在的文件. 3  * 使图片在放大到超过主窗口大小时, 能通过拖曳 4  */ 5 #ifndef SVGWINDOW_H 6 #define SVGWINDOW_H 7  8 #include <QScrollArea> 9 #include "svgwidget.h"10 11 class SvgWindow : public QScrollArea12 {13     Q_OBJECT14 public:15     SvgWindow(QWidget *parent = 0);16     void setFile(QString);17     void mousePressEvent (QMouseEvent *);18     void mouseMoveEvent (QMouseEvent *);19 private:20     SvgWidget *svgWidget;21     QPoint mousePressPos;22     QPoint scrollBarValueOnMousePress;23 };24 25 #endif // SVGWINDOW_H
复制代码

//svgwindow.cpp

复制代码
 1 #include "svgwindow.h" 2  3 SvgWindow::SvgWindow(QWidget *parent) 4     : QScrollArea(parent) 5 { 6     svgWidget = new SvgWidget; 7     setWidget (svgWidget);       //设置滚动条 8 } 9 10 //当主窗口对文件进行了选择或修改时, 将调用setFile()函数设置新的文件11 void SvgWindow::setFile (QString fileName)12 {13     //将新的SVG文件加载到svgWidget中显示14     svgWidget->load (fileName);15     //返回渲染器,去显示控件的内容16     QSvgRenderer *render = svgWidget->renderer ();17     //使svgWidget窗体按SVG图片的默认尺寸进行显示18     svgWidget->resize (render->defaultSize ());19 20 }21 22 /***23  * 鼠标键按下时,mousePressPos和scrollBarValuesOnMousePress进行初始化,QScrollArea的horizonalScrollBar()24  * 和verticalScrollBar()函数可以分别获得svgWindow的水平滚动条和垂直滚动条25  */26 void SvgWindow::mousePressEvent (QMouseEvent *event)27 {28     mousePressPos = event->pos ();         //记下当前事件位置29     scrollBarValueOnMousePress.rx () = horizontalScrollBar ()->value ();30     scrollBarValueOnMousePress.ry () = verticalScrollBar ()->value ();31     //设置事件对象的接受信号,表明事件接受器希望事件,意外事件传到父部件32     event->accept ();33 }34 35 /***36  * 当鼠标按下并拖曳鼠标时, 触发mouseMoveEvent()函数,通过滑动条的位置设置实现图片图片拖曳的效果37  */38 void SvgWindow::mouseMoveEvent (QMouseEvent *event)39 {40     //对水平滑动条的新位置进行设置41     //新水平滑动条位置 = (滑块当前位置 - 鼠标即时返回的位置)(即:滑块移动位置) + 鼠标之前记下的事件位置42     horizontalScrollBar ()->setValue (scrollBarValueOnMousePress.x () - event->pos ().x () + mousePressPos.x ());43     //对垂直滑动条的新位置进行设置44     verticalScrollBar ()->setValue (scrollBarValueOnMousePress.y () - event->pos ().y () + mousePressPos.y ());45     horizontalScrollBar ()->update ();46     verticalScrollBar ()->update ();47     event->accept ();48 }
复制代码

//mainwindow.h

复制代码
 1 #ifndef MAINWINDOW_H 2 #define MAINWINDOW_H 3  4 #include <QMainWindow> 5 #include "svgwindow.h" 6  7 class MainWindow : public QMainWindow 8 { 9     Q_OBJECT10 11 public:12     MainWindow(QWidget *parent = 0);13     ~MainWindow();14     void createMenu();15 public slots:16     void slotOpenFile();17 private:18     SvgWindow *svgWindow;              //用于调用相关函数传递选择的文件名19 };20 21 #endif // MAINWINDOW_H
复制代码

//mainwindow.cpp

复制代码
 1 #include "mainwindow.h" 2  3 MainWindow::MainWindow(QWidget *parent) 4     : QMainWindow(parent) 5 { 6     setWindowTitle (tr("SVG Viewer")); 7     createMenu (); 8     svgWindow = new SvgWindow; 9     setCentralWidget (svgWindow);10 }11 12 //创建菜单栏13 void MainWindow::createMenu ()14 {15     //添加“文件”菜单条16     QMenu *fileMenu = menuBar ()->addMenu (tr("文件"));17     QAction *openAct = new QAction(tr("打开"), this);18     connect (openAct, SIGNAL(triggered(bool)), this, SLOT(slotOpenFile()));19     //添加"打开"菜单项20     fileMenu->addAction(openAct);21 }22 23 //通过标准文件对话框选择SVG文件, 并调用SvgWindow的setFile()函数将选择的文件名传递给svgWindow进行显示24 void MainWindow::slotOpenFile ()25 {26     QString name = QFileDialog::getOpenFileName (this, "打开", "/", "svg file(*.svg)");27     svgWindow->setFile (name);28 }29 30 MainWindow::~MainWindow()31 {32 33 }
复制代码

//main.cpp

复制代码
 1 #include "mainwindow.h" 2 #include <QApplication> 3  4 int main(int argc, char *argv[]) 5 { 6     QApplication a(argc, argv); 7     MainWindow w; 8     w.show(); 9 10     return a.exec();11 }
复制代码

 

原创粉丝点击