




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第7章 Qt 5圖形視圖框架圖形視圖體系結構圖形視圖體系結構7.17.2【實例】:圖形視圖【實例】:圖形視圖7.1 圖形視圖體系結構圖形視圖體系結構7.1.1 Graphics View的特點的特點Graphics View框架結構的主要特點如下。(1)Graphics View框架結構中,系統可以利用Qt繪圖系統的反鋸齒、OpenGL工具來改善繪圖性能。(2)Graphics View支持事件傳播體系結構,可以使圖元在場景(scene)中的交互能力提高1倍,圖元能夠處理鍵盤事件和鼠標事件。其中,鼠標事件包括鼠標按下、移動、釋放和雙擊,還可以跟蹤鼠標的移動。(3)在Graphics View框
2、架中,通過二元空間劃分樹(Binary Space Partitioning,BSP)提供快速的圖元查找,這樣就能夠實時地顯示包含上百萬個圖元的大場景。7.1.2 Graphics View的三元素的三元素它們三者之間的關系如圖7.1所示。7.1.2 Graphics View的三元素的三元素1場景類:場景類:QGraphicsScene類類場景類主要完成的工作包括提供對它包含的圖元的操作接口和傳遞事件、管理各個圖元的狀態(如選擇和焦點處理)、提供無變換的繪制功能(如打?。┑?。事件傳播體系結構將場景事件發送給圖元,同時也管理圖元之間的事件傳播。如果場景接收到了在某一點的鼠標單擊事件,場景會將事
3、件傳給在這一點的圖元。管理各個圖元的狀態(如選擇和焦點處理)。可以通過QGraphicsScene: setSelectionArea()函數選擇圖元,選擇區域可以是任意的形狀,使用QPainterPath表示。若要得到當前選擇的圖元列表,則可以使用函數QGraphicsScene: selectedItems()。可以通過QGraphicsScene: setFocusItem()函數或QGraphicsScene: setFocus()函數來設置圖元的焦點,獲得當前具有焦點的圖元使用函數QGraphicsScene:focusItem()。7.1.2 Graphics View的三元素的三
4、元素2視圖類:視圖類:QGraphicsView類類它提供一個可視的窗口,用于顯示場景中的圖元。在同一個場景中可以有多個視圖,也可以為相同的數據集提供幾種不同的視圖。QGraphicsView是可滾動的窗口部件,可以提供滾動條來瀏覽大的場景。如果需要使用OpenGL,則可以使用QGraphicsView:setViewport()將視圖設置為QGLWidget。視圖接收鍵盤和鼠標的輸入事件,并將它們翻譯為場景事件(將坐標轉換為場景的坐標)。使用變換矩陣函數QGraphicsView:matrix()可以變換場景的坐標,實現場景縮放和旋轉。QGraphicsView提供QGraphicsView
5、:mapToScene()和QGraphicsView: mapFromScene()用于與場景的坐標進行轉換。7.1.2 Graphics View的三元素的三元素3圖元類:圖元類:QGraphicsItem類類QGraphicsItem主要有以下幾點功能。 處理鼠標按下、移動、釋放、雙擊、懸停、滾輪和右鍵菜單事件。 處理鍵盤輸入事件。 處理拖曳事件。 分組。 碰撞檢測。7.1.3 GraphicsView的坐標系統的坐標系統1場景坐標場景坐標場景坐標是所有圖元的基礎坐標系統。場景坐標系統描述了頂層的圖元,每個圖元都有場景坐標和相應的包容框。場景坐標的原點在場景中心,坐標原點是X軸正方向向右
6、,Y軸正方向向下。QGraphicsScene類的坐標系以中心為原點(0,0),如圖7.2所示。7.1.3 GraphicsView的坐標系統的坐標系統2視圖坐標視圖坐標視圖坐標是窗口部件的坐標。視圖坐標的單位是像素。QGraphicsView視圖的左上角是(0,0),X軸正方向向右,Y軸正方向向下。所有的鼠標事件最開始都是使用視圖坐標。QGraphicsView類繼承自QWidget類,因此它與其他的QWidget類一樣,以窗口的左上角作為自己坐標系的原點,如圖7.3所示。7.1.3 GraphicsView的坐標系統的坐標系統3圖元坐標圖元坐標圖元使用自己的本地坐標,這個坐標系統通常以圖元
7、中心為原點,這也是所有變換的原點。圖元坐標方向是X軸正方向向右,Y軸正方向向下。創建圖元后,只需注意圖元坐標就可以了,QGraphicsScene和QGraphicsView會完成所有的變換。QgraphicsItem類的坐標系,若在調用QgraphicsItem類的paint()函數重繪圖元時,則以此坐標系為基準,如圖7.4所示。7.1.3 GraphicsView的坐標系統的坐標系統Graphics View框架提供了多種坐標變換函數,見表7.1。映 射 函 數轉 換 類 型QgraphicsView:mapToScene()視圖到場景QgraphicsView:mapFromScene(
8、)場景到視圖QgraphicsItem: mapFromScene()場景到圖元QGraphicsItem: mapToScene()圖元到場景QGraphicsItem: mapToParent()子圖元到父圖元QGraphicsItem: mapFromParent()父圖元到子圖元QGraphicsItem: mapToItem()本圖元到其他圖元QGraphicsItem: mapFromItem()其他圖元到本圖元7.2 【實例】:圖形視圖【實例】:圖形視圖7.2.1 飛舞的蝴蝶飛舞的蝴蝶以下是實現上述例子的具體操作步驟。(1)新建Qt Widgets Application(詳見1
9、.3.1節),項目名為“Butterfly”,基類選擇“QMainWindow”,類名命名默認為“MainWindow”,取消“創建界面”復選框的選中狀態。單擊“下一步”按鈕,最后單擊“完成”按鈕,完成該項目工程的建立。(2)在“Butterfly”項目名上單擊鼠標右鍵,在彈出的快捷菜單中選擇“添加新文件.”菜單項,在彈出的對話框中選擇“C+ Class”選項。單擊“Choose.”按鈕,彈出對話框,在“Base class”后面的下拉列表框中選擇基類名“QObject”,在“Class name”后面的文本框中輸入類的名稱“Butterfly”。(3)單擊“下一步”按鈕,單擊“完成”按鈕,添
10、加文件“butterfly.h”和“butterfly. cpp”。7.2.1 飛舞的蝴蝶飛舞的蝴蝶(4)Butterfly類繼承自QObject類、QGraphicsItem類,在頭文件“butterfly.h”中完成的代碼具體內容。(5)在源文件“butterfly. cpp”中完成的代碼具體內容如下:#include butterfly.h#include const static double PI=3.1416;Butterfly:Butterfly(QObject *parent) up = true;/給標志蝴蝶翅膀位置的變量賦初值 pix_up.load(up.png);/調用
11、QPixmap的load()函數加載所用到的圖片 pix_down.load(down.png); startTimer(100);/啟動定時器,并設置時間間隔為100毫秒7.2.1 飛舞的蝴蝶飛舞的蝴蝶boundingRect()函數為圖元限定區域范圍。此范圍是以圖元自身的坐標系為基礎設定的。具體實現代碼內容如下:QRectF Butterfly:boundingRect() const qreal adjust =2; return QRectF(-pix_up.width()/2-adjust,-pix_up.height()/2-adjust, pix_up.width()+adjus
12、t*2,pix_up.height()+adjust*2);7.2.1 飛舞的蝴蝶飛舞的蝴蝶在重畫函數paint()中,首先判斷當前已顯示的圖片是pix_up還是pix_down。實現蝴蝶翅膀上下飛舞效果時,若當前顯示的是pix_up圖片,則重繪pix_down圖片,反之亦然。具體實現代碼內容如下:void Butterfly:paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) if(up) painter-drawPixmap(boundingRect().topLeft(),pi
13、x_up); up=!up; else painter-drawPixmap(boundingRect().topLeft(),pix_down); up=!up; 7.2.1 飛舞的蝴蝶飛舞的蝴蝶定時器的timerEvent()函數實現蝴蝶的飛舞,具體實現代碼內容如下:void Butterfly:timerEvent(QTimerEvent *) /邊界控制 qreal edgex=scene()-sceneRect().right()+boundingRect().width()/2;/限定蝴蝶飛舞的右邊界 qreal edgetop=scene()-sceneRect().top()+
14、boundingRect(). height()/2;/限定蝴蝶飛舞的上邊界 qreal edgebottom=scene()-sceneRect().bottom()+boundingRect(). height()/2;/限定蝴蝶飛舞的下邊界 if(pos().x()=edgex)/若超過了右邊界,則水平移回左邊界處 setPos(scene()-sceneRect().left(),pos().y(); if(pos().y()sceneRect().bottom(); if(pos().y()=edgebottom)/若超過了下邊界,則垂直移回上邊界處 setPos(pos().x()
15、,scene()-sceneRect().top(); angle+=(qrand()%10)/20.0; qreal dx=fabs(sin(angle*PI)*10.0); qreal dy=(qrand()%20)-10.0; setPos(mapToParent(dx,dy);/(a)7.2.1 飛舞的蝴蝶飛舞的蝴蝶(6)完成了蝴蝶圖元的實現后,在源文件“main.cpp”中將它加載到場景中,并關聯一個視圖,具體實現代碼內容如下:#include #include butterfly.h#include int main(int argc,char* argv) QApplicatio
16、n a(argc,argv); QGraphicsScene *scene = new QGraphicsScene; scene-setSceneRect(QRectF(-200,-200,400,400); Butterfly *butterfly = new Butterfly; butterfly-setPos(-100,0); scene-addItem(butterfly); QGraphicsView *view = new QGraphicsView; view-setScene(scene); view-resize(400,400); view-show(); return
17、 a.exec();7.2.1 飛舞的蝴蝶飛舞的蝴蝶(7)運行程序,將程序中用到的圖片保存到該工程的D:QtCH7CH701 build-Butterfly-Desktop_Qt_5_4_0_MinGW_32bit-Debug文件夾中,運行結果如圖7.5所示。7.2.2 地圖瀏覽器地圖瀏覽器 通過實現一個地圖瀏覽器的基本功能(包括地圖的瀏覽、放大、縮小,以及顯示各點的坐標等)的例子,如圖7.6所示,介紹如何使用Graphics View框架。實例文件見光盤CH702。7.2.2 地圖瀏覽器地圖瀏覽器 以下是實現這個例子的具體操作步驟。(1)新建Qt Widgets Application (詳
18、見1.3.1節),項目名稱為“MapWidget”,基類選擇“QMainWindow”,類名命名默認為“MainWindow”,取消“創建界面”復選框的選中狀態。單擊“下一步”按鈕,最后單擊“完成”按鈕,完成該項目工程的建立。(2)在“MapWidget”項目名上單擊鼠標右鍵,在彈出的快捷菜單中選擇“添加新文件.”菜單項,在彈出的對話框中選擇“C+ Class”選項。單擊“Choose.”按鈕,彈出對話框,在“Base class”后面的下拉列表框中輸入基類名“QGraphicsView”(手工添加),在“Class name”后面的文本框中輸入類的名稱“MapWidget”。7.2.2 地圖
19、瀏覽器地圖瀏覽器 (3)單擊“下一步”按鈕,單擊“完成”按鈕,添加文件“mapwidget.h”和文件“mapwidget.cpp”。(4)MapWidget類繼承自QGraphicsView類,作為地圖瀏覽器的主窗體。在頭文件“mapwidget.h”中完成的代碼。(5)在源文件“mapwidget.cpp”中完成的代碼。(6)新建一個文本文件“maps.txt”,利用該文本文件描述與地圖相關的信息,將該文件保存在該工程下的D:QtCH7CH702 build-MapWidget-Desktop_Qt_5_ 4_0_ MinGW_32bit-Debug文件中,文件內容為:China.jpg
20、114.4665527 35.96022297 119.9597168 31.39115757.2.2 地圖瀏覽器地圖瀏覽器 (7)打開“mapwidget.cpp”文件,添加讀取地圖信息readMap()函數的具體實現代碼如下:void MapWidget:readMap() /讀取地圖信息 QString mapName; QFile mapFile(maps.txt);/(a) int ok = mapFile.open(QIODevice:ReadOnly);/以“只讀”方式打開此文件 if(ok)/分別讀取地圖的名稱和四個經緯度信息 QTextStream ts(&mapFile);
21、 if(!ts.atEnd() tsmapName; tsx1y1x2y2; map.load(mapName);/將地圖讀取至私有變量map中7.2.2 地圖瀏覽器地圖瀏覽器 根據縮放滑動條的當前值,確定縮放的比例,調用scale()函數實現地圖縮放。完成地圖縮放功能的slotZoom()函數的具體實現代碼內容如下:void MapWidget:slotZoom(int value) /地圖縮放 qreal s; if(valuezoom) /放大 s=pow(1.01,(value-zoom); else /縮小 s=pow(1/1.01,(zoom-value); scale(s,s);
22、 zoom = value;7.2.2 地圖瀏覽器地圖瀏覽器 QGraphicsView類的drawBackground()函數中以地圖圖片重繪場景的背景來實現地圖顯示。具體實現代碼。void MapWidget:drawBackground(QPainter *painter, const QRectF &rect) painter-drawPixmap(int(sceneRect().left(),int(sceneRect(). top(), map);7.2.2 地圖瀏覽器地圖瀏覽器 響應鼠標移動事件mouseMoveEvent()函數,完成某點在各層坐標中的映射及顯示。具體實現代碼如
23、下:void MapWidget:mouseMoveEvent(QMouseEvent *event) /QGraphicsView 坐標 QPoint viewPoint = event-pos(); viewCoord-setText(QString:number(viewPoint.x()+,+ QString:number(viewPoint.y(); /QGraphicsScene 坐標 QPointF scenePoint = mapToScene(viewPoint); sceneCoord-setText(QString:number(scenePoint.x()+,+ QSt
24、ring:number(scenePoint.y(); /地圖坐標(經、緯度值) QPointF latLon = mapToMap(scenePoint); mapCoord-setText(QString:number(latLon.x()+,+ QString:number(latLon.y();7.2.2 地圖瀏覽器地圖瀏覽器 完成從場景坐標至地圖坐標的轉換mapToMap()函數。具體實現代碼如下:QPointF MapWidget:mapToMap(QPointF p) QPointF latLon; qreal w =sceneRect().width(); qreal h =s
25、ceneRect().height(); qreal lon = y1-(h/2+p.y()*abs(y1-y2)/h); qreal lat = x1+(w/2+p.x()*abs(x1-x2)/w); latLon.setX(lat); latLon.setY(lon); return latLon;7.2.2 地圖瀏覽器地圖瀏覽器 (8)下面是文件“main.cpp”的具體代碼:#include #include mapwidget.h#include int main(int argc, char *argv) QApplication a(argc, argv); QFont fon
26、t(ARPL KaitiM GB,12); font.setBold(true); a.setFont(font); MapWidget mapWidget; mapWidget.show(); return a.exec();(9)將程序用到的圖片保存到該工程的D:QtCH7CH702 build-MapWidget- Desktop_Qt_5_4_0_MinGW_32bit-Debug文件夾中,運行結果如圖7.6所示。7.2.3 圖元創建圖元創建通過實現一個在其中顯示各種類型QGraphicsItem的窗體例子(如圖7.7所示),介紹如何使用Qt預定義的各種標準的QGraphicsItem
27、類型(如QGraphicsEllipseItem、QGraphicsRectItem等),以及自定義的QGraphicsItem類型(如本例中不停閃爍的圓及來回移動的星星等)來創建圖元。實例文件見光盤CH703。7.2.3 圖元創建圖元創建以下是實現這個例子的具體操作步驟。(1)新建Qt Widgets Application(詳見1.3.1節),項目名稱為“GraphicsItem”,基類選擇“QMainWindow”,類名命名默認為“MainWindow”,取消“創建界面”復選框的選中狀態。單擊“下一步”按鈕,最后單擊“完成”按鈕,完成該項目工程的建立。(2)MainWindow類繼承自Q
28、MainWindow作為主窗體,包含一個加入圖元的各種操作的菜單欄,以及一個顯示各種類型圖元的QGraphicsView作為主窗體的centralWidget。“mainwindow.h”文件的具體代碼實現內容。(3)“mainwindow.cpp”文件中的代碼。7.2.3 圖元創建圖元創建(4)將程序中所用圖片保存到該工程的D:QtCH7CH703build-GraphicsItem- Desktop_Qt_5_4_0_MinGW_32bit-Debug文件夾下,此時運行效果如圖7.8所示。7.2.3 圖元創建圖元創建以上完成了主窗體的顯示工作,下面介紹如何實現圓的閃爍功能。 (1)在“Gr
29、aphicsItem”項目名上單擊鼠標右鍵,在彈出的快捷菜單中選擇“添加新文件.”菜單項,在彈出的對話框中選擇“C+ Class”選項。單擊“Choose.”按鈕,彈出對話框,在“Base class”后面的下拉列表框中選擇基類名“QObject”,在“Class name”后面的文本框中輸入類的名稱“FlashItem”。FlashItem類繼承自QGraphicsItem類和QObject類,閃爍效果是通過利用定時器的timerEvent()函數定時重畫圓的顏色來實現的。(2)單擊“下一步”按鈕,單擊“完成”按鈕,添加文件“flashitem.h”和文件“flashitem.cpp”。7.
30、2.3 圖元創建圖元創建(3)“flashitem.h”文件的具體代碼如下:#include #include class FlashItem : public QObject,public QGraphicsItem Q_OBJECTpublic: explicit FlashItem(QObject *parent = 0); QRectF boundingRect() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void timerEvent(
31、QTimerEvent *);private: bool flash; QTimer *timer;signals:public slots:;7.2.3 圖元創建圖元創建(4)“flashitem.cpp”文件的具體代碼如下:#include flashitem.hFlashItem:FlashItem(QObject *parent) : QObject(parent) flash=true;/為顏色切換標識賦初值 setFlag(ItemIsMovable);/(a) startTimer(1000);/啟動一個定時器,以1000毫秒為時間間隔7.2.3 圖元創建圖元創建定義圖元邊界的函
32、數boundingRect(),完成以圖元坐標系為基礎,增加兩個像素點的冗余工作。具體實現代碼如下:QRectF FlashItem:boundingRect() const qreal adjust = 2; return QRectF(-10-adjust,-10-adjust,43+adjust,43+adjust);7.2.3 圖元創建圖元創建為自定義圖元重繪的函數paint()具體實現代碼如下:void FlashItem:paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
33、 painter-setPen(Qt:NoPen);/閃爍圖元的陰影區不繪制邊線 painter-setBrush(Qt:darkGray);/閃爍圖元的陰影區的陰影畫刷顏色為深灰 painter-drawEllipse(-7,-7,40,40); /繪制陰影區 painter-setPen(QPen(Qt:black,0);/閃爍區的橢圓邊線顏色為黑色、線寬為0 painter-setBrush(flash?(Qt:red):(Qt:yellow);/(a) painter-drawEllipse(-10,-10,40,40);/(b)7.2.3 圖元創建圖元創建定時器響應函數timerEv
34、ent()完成顏色切換標識的反置,并在每次反置后調用update()函數重繪圖元以實現閃爍的效果。具體實現代碼如下:void FlashItem:timerEvent(QTimerEvent *) flash=!flash; update();7.2.3 圖元創建圖元創建(5)在“mainwindow.h”文件中添加代碼如下:public slots: void slotAddFlashItem();private: QAction *addFlashItemAct;7.2.3 圖元創建圖元創建(6)在“mainwindow.cpp”文件中添加代碼如下:#include flashitem.h
35、其中,其中,在createActions()函數中添加代碼如下:addFlashItemAct = new QAction(tr(加入閃爍圓),this);connect(addFlashItemAct,SIGNAL(triggered(),this,SLOT(slotAddFlashItem();在createMenus()函數中添加代碼如下:itemsMenu-addAction(addFlashItemAct);在initScene()函數中添加代碼如下:for(i=0;iaddItem(item); item-setPos(qrand()%int(scene-sceneRect().w
36、idth()-200, (qrand()%int(scene-sceneRect().height()-200);7.2.3 圖元創建圖元創建(7)運行效果如圖7.9所示。7.2.3 圖元創建圖元創建下面將接著完成實現星星移動的功能。(1)向項目中添加一個新的C+類,類名命名為“StartItem”,操作步驟同前。StartItem類繼承自QGraphicsItem類,實際上是一個圖片圖元?!皊tartitem.h”文件的具體代碼如下:#include #include class StartItem : public QGraphicsItempublic: StartItem(); QRe
37、ctF boundingRect() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);private: QPixmap pix;7.2.3 圖元創建圖元創建(2)StartItem構造函數中僅完成讀取圖片信息的工作。“startitem.cpp”文件中的具體代碼如下:#include startitem.hStartItem:StartItem() pix.load(star.png);定義圖元的邊界函數boundingRect(),所有自定義圖元均必須實
38、現的函數,代碼如下:QRectF StartItem:boundingRect() const return QRectF(-pix.width()/2,-pix.height()/2,pix.width(),pix. height();自定義圖元重繪函數paint(),代碼如下:void StartItem:paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget) painter-drawPixmap(boundingRect().topLeft(),pix);7.2.3 圖元創建圖元創建
39、(3)在“mainwindow.h”文件中添加代碼如下:public slots: void slotAddAnimationItem();private: QAction *addAnimItemAct;7.2.3 圖元創建圖元創建(4)在“mainwindow.cpp”文件中添加代碼如下:#include startitem.h#include #include 其中,其中,在createActions()函數中添加代碼如下:addAnimItemAct = new QAction(tr(加入 星星),this);connect(addAnimItemAct,SIGNAL(triggere
40、d(),this,SLOT(slotAddAnimationItem();在createMenus()函數中添加代碼如下:itemsMenu-addAction(addAnimItemAct);在initScene()函數中添加代碼如下:for(i=0;isetItem(item); QTimeLine *timeLine = new QTimeLine(4000); timeLine-setCurveShape(QTimeLine:SineCurve); timeLine-setLoopCount(0); anim-setTimeLine(timeLine); int y =(qrand()
41、%400)-200; for(int i=0;isetPosAt(i/400.0,QPointF(i-200,y); timeLine-start(); scene-addItem(item);(5)最終運行結果如圖7.7所示,圖中的小星星會不停地左右移動。7.2.4 圖元的旋轉、縮放、切變和位移圖元的旋轉、縮放、切變和位移通過此實例介紹如何實現圖元(QGraphicsItem)的旋轉、縮放、切變及位移等各種變形操作,如圖7.10所示。實例文件見光盤CH704。7.2.4 圖元的旋轉、縮放、切變和位移圖元的旋轉、縮放、切變和位移(1)新建Qt Widgets Application(詳見1.3
42、.1節),項目名稱為“ItemWidget”,基類選擇“QWidget”,類名命名為“MainWidget”,取消“創建界面”復選框的選中狀態。單擊“下一步”按鈕,最后單擊“完成”按鈕,完成該項目工程的建立。(2)MainWidget類繼承自QWidget,作為主窗體類,用于對圖元的顯示,包含一個控制面板區及一個顯示區。7.2.4 圖元的旋轉、縮放、切變和位移圖元的旋轉、縮放、切變和位移“mainwidget.h”文件中的代碼如下:#include #include #include #include class MainWidget : public QWidget Q_OBJECTpubl
43、ic: MainWidget(QWidget *parent = 0); MainWidget(); void createControlFrame();private: int angle; qreal scaleValue; qreal shearValue; qreal translateValue; QGraphicsView *view; QFrame *ctrlFrame;7.2.4 圖元的旋轉、縮放、切變和位移圖元的旋轉、縮放、切變和位移(3)“mainwidget.cpp”文件中的具體代碼。右側的控制面板區分為旋轉控制區、縮放控制區、切變控制區及位移控制區,每個區均由包含一個Q
44、Slider對象的QGroupBox對象實現,具體實現代碼。(4)運行效果如圖7.11所示。7.2.4 圖元的旋轉、縮放、切變和位移圖元的旋轉、縮放、切變和位移上面完成的是主窗體的功能,下面介紹用于變形顯示的圖元的制作。(1)在“ItemWidget”項目名上單擊鼠標右鍵,在彈出的快捷菜單中選擇“添加新文件.”菜單項,在彈出的對話框中選擇“C+ Class”選項。單擊“Choose.”按鈕,彈出對話框,在“Base class”后面的下拉列表框中輸入基類名“QGraphicsItem”(手工添加),在“Class name”后面的文本框中輸入類的名稱“PixItem”。(2)單擊“下一步”按鈕
45、,單擊“完成”按鈕,添加文件“pixitem.h”和文件“pixitem.cpp”。7.2.4 圖元的旋轉、縮放、切變和位移圖元的旋轉、縮放、切變和位移(3)自定義PixItem類繼承自QGraphicsItem類。“pixitem.h”文件中的具體代碼如下:#include #include #include class PixItem : public QGraphicsItempublic: PixItem(QPixmap *pixmap); QRectF boundingRect() const; void paint(QPainter *painter, const QStyleOp
46、tionGraphicsItem *option, QWidget *widget);private: QPixmap pix; /作為圖元顯示的圖片;7.2.4 圖元的旋轉、縮放、切變和位移圖元的旋轉、縮放、切變和位移(4)PixItem的構造函數只是初始化了變量pix?!皃ixitem.cpp”文件中的具體內容如下:#include pixitem.hPixItem:PixItem(QPixmap *pixmap) pix = *pixmap;定義圖元邊界的函數boundingRect(),完成以圖元坐標系為基礎增加兩個像素點的冗余的工作。具體實現代碼如下:QRectF PixItem:b
47、oundingRect() const return QRectF(-2-pix.width()/2,-2-pix.height()/2,pix.width()+4, pix. height()+4);重畫函數只需QPainter的drawPixmap()函數將圖元圖片繪出即可。具體代碼如下:void PixItem:paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget) painter-drawPixmap(-pix.width()/2,-pix.height()/2,pix);7.2.
48、4 圖元的旋轉、縮放、切變和位移圖元的旋轉、縮放、切變和位移(5)在“mainwidget.h”文件中添加代碼如下:#include pixitem.hprivate:PixItem *pixItem;(6)打開“mainwidget.cpp”文件,在語句scene-setSceneRect(-200,-200,400,400)與view = new QGraphicsView之間添加如下代碼:QPixmap *pixmap = new QPixmap(image.png);pixItem = new PixItem(pixmap);scene-addItem(pixItem);pixItem-setPos(0,0);7.2.4 圖元的旋轉、縮放
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 園林用地移交協議書
- 解除母親關系協議書
- 終止解除協議書范本
- 繼承父母房子協議書
- 馬上消費還款協議書
- 駐廠員工協議書范本
- 農田復耕協議書文案
- 簡單安全用電協議書
- 鹵菜物品轉讓協議書
- 樂團演員聘用協議書
- GB/T 10004-2008包裝用塑料復合膜、袋干法復合、擠出復合
- 核磁-波普分析課件
- 部編人教版道德與法治四年級下冊《合理消費》優質課件
- 吉林省吉林市2022-2023學年高三上學期第一次調研測英語含答案
- 閩南建筑風格研究課件
- 小學美術 嶺南版 六年級 古代傳說中的藝術形象 ppt 課件
- 保潔投標書(范本)
- 幼兒園《插座電線我不碰》
- 生產線直通率統計表
- 常用有縫鋼管的規格及有關參數
- 大腸桿菌及大腸菌群計數方法
評論
0/150
提交評論