源代碼鏈接: 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 }
