<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
SVG的英文全稱是Scalable Vector Graphics,即可縮放的向量圖形。它是由全球資訊網聯盟(W3C)在2000年8月制定的一種新的二維向量圖形格式,也是規範中的網格適量圖形標準,是一個開放的圖形標準。
SVG格式的特點如下:
(1)基於XML
(2)採用文字來描述物件
(3)具有互動性和動態性
(4)完全支援DOM
SVG相對於GIF、JPEG格式的優勢是,SVG是一種向量圖形格式,比GIF、JPEG等柵格格式具有眾多優勢,如檔案小、可任意縮放而不破壞影象的清晰度和細節等。
Qt為SVG格式圖片的顯示與生成提供了專門的QtSvg模組,此模組中包含了與SVG圖片相關的所有類,主要有QSvgWidget、QSvgRender和QGraphicsSvgItem。
利用QtSvg實現SVG圖片瀏覽器,可以顯示SVG結尾的檔案圖片。
新建一個Qt案例,專案名稱為“SVGTest”,基礎類別選擇“QMainWindow”,取消建立UI介面核取方塊的選中狀態,完成專案建立。
無UI介面
如果是QT5版本,需要在pro工程檔案中加入一行程式碼:
QT+=svg
如果是QT6版本,需要在pro工程檔案中加入一行程式碼:
QT+=svgwidgets
【不同Qt版本,新增的qmake不相同,這裡建議參考幫助檔案:】
專案名——>滑鼠右鍵——>Add New——>C++ Class——>新增如下內容
建立完成後,專案中會出現svgwindow.h和svgwindow.cpp。
專案名——>滑鼠右鍵——>Add New——>C++ Class——>新增如下內容
建立完成後,專案中會出現svgwidget.h和svgwidget.cpp,如下所示:
SvgWidget類繼承自QSvgWidget類,主要顯示SVG圖片。
在public中宣告一下響應滑鼠的捲動事件,使SVG圖片可以通過滑鼠捲動進行縮放,然後宣告render變數,用於圖片顯示尺寸的確定:
#include <QSvgWidget> #include<QtSvg> #include<QSvgRenderer> public: void wheelEvent(QWheelEvent *);//響應滑鼠的捲動事件,使SVG圖片可以通過滑鼠捲動進行縮放 private: QSvgRenderer *render;//用於圖片顯示尺寸的確定
SvgWidget函數獲得本表單的QSvgRenderer物件,程式碼如下:
SvgWidget::SvgWidget() { render=renderer(); }
然後定義滑鼠滾輪的響應事件,使SVG圖片可以通過滑鼠捲動進行縮放:
void SvgWidget::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);//重新調整大小 }
SvgWindow類繼承自QScrollArea,是一個帶卷軸的顯示區域。在SvgWindow類實現包含"svgwidget.h"的標頭檔案,該類使圖片在放大到超過主視窗大小時,能夠通過拖拽卷軸的方式進行檢視。
新增程式碼如下:
#include"svgwidget.h" public: void setFile(QString); void mousePressEvent(QMouseEvent *); void mouseMoveEvent(QMouseEvent *); private: SvgWidget *svgWidget; QPoint mousePressPos; QPoint scrollBarValuesMousePress;
主函數內進行設定捲動區的表單,使svgWidget成為SvgWindow的子視窗:
svgWidget=new SvgWidget; setWidget(svgWidget);
當主視窗中對檔案進行了選擇或修改時,呼叫setFile()函數設定新的檔案:
//設定新的檔案 void SvgWindow::setFile(QString filename){ svgWidget->load(filename);//將新的SVG檔案載入到svgWidget中進行顯示 QSvgRenderer *render=svgWidget->renderer(); svgWidget->resize(render->defaultSize());//按照SVG檔案的預設尺寸進行顯示 }
滑鼠按下時,獲取水平卷軸和垂直卷軸的值:
//滑鼠按下響應函數 void SvgWindow::mousePressEvent(QMouseEvent *e) { mousePressPos=e->pos(); scrollBarValuesMousePress.rx()=horizontalScrollBar()->value(); scrollBarValuesMousePress.ry()=verticalScrollBar()->value(); e->accept(); }
當滑鼠鍵按下並且拖拽滑鼠時觸發mouseMoveEvent()函數,通過卷軸的位置設定實現圖片拖拽效果:
//滑鼠按下且拖拽響應函數 void SvgWindow::mouseMoveEvent(QMouseEvent *e) { horizontalScrollBar()->setValue(scrollBarValuesMousePress.x()- e->pos().x()+mousePressPos.x());//對水平卷軸的新位置進行設定 verticalScrollBar()->setValue(scrollBarValuesMousePress.y()- e->pos().y()+mousePressPos.y());//對垂直卷軸的新位置進行設定 horizontalScrollBar()->update(); verticalScrollBar()->update(); e->accept(); }
標頭檔案中包含"svgwindow.h"標頭檔案,並且宣告開啟檔案選單的槽函數和svgwindow用於呼叫相關函數傳遞選擇的檔名:
#include"svgwindow.h" public slots: void slotOpenFile();//開啟檔案槽函數 private: SvgWindow *svgwindow; //用於呼叫相關函數傳遞選擇的檔名
主視窗MainWindow包含一個選單欄,其中有一個“檔案”子選單,包含一個“開啟”選單項,程式碼如下:
setWindowTitle("SVG Viewer");//設定視窗標題 QMenu *fileMenu=menuBar()->addMenu("檔案");//選單欄新增"檔案" QAction *openAct=new QAction("開啟",this);//"檔案"中新增"開啟"子選單 connect(openAct,SIGNAL(triggered()),this,SLOT(slotOpenFile()));//點選開啟觸發slotOpenFile()槽函數 fileMenu->addAction(openAct); svgwindow=new SvgWindow; setCentralWidget(svgwindow); resize(800,600);//初始大小
定義開啟選單的槽函數:
//開啟選單的槽函數 void MainWindow::slotOpenFile() { QString name=QFileDialog::getOpenFileName(this,"開啟","/","svg files(*.svg)"); svgwindow->setFile(name); }
以上就是基於Qt實現SVG圖片瀏覽器的詳細內容,更多關於Qt SVG圖片瀏覽器的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45