QT_SVG格式圖片瀏覽器_源代碼下載_詳細注釋


源代碼鏈接: http://pan.baidu.com/s/1pKA5Vcv 密碼: ib2x

注:SVG格式圖片特點: 1. 文件小 2. 圖像中文字獨立於圖像, 可以編輯,可搜索. 3.沒有字體限制 4.可以任意縮放而不破壞圖像清晰度和細節

下面實現一個SVG圖片瀏覽器.

顯示效果如圖(放大超過窗口大小時, 可以通過滾動條拖曳查看圖片)

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 QSvgWidget
12 {
13     Q_OBJECT
14 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     else
34     {
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 QScrollArea
12 {
13     Q_OBJECT
14 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_OBJECT
10 
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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM