Qt提供了圖形視圖架構(GraphicsView Framework)、動畫架構(The Animation Framework)、狀态機架構(The State Machine Framework)來實作更加進階的圖形與動畫應用。使用這些架構可以快速設計出動态GUI應用和各種動畫、遊戲程式。
圖形視圖架構提供了基于圖像項模型的模型視圖程式設計方法,主要由場景、視圖和圖形項這三部分組成,這三部分分别由QGraphicsScene、QGraphicsView、QGraphicsItem這三個類來表示。
多個視圖可以檢視一個場景,場景中包含了各種幾個形狀的圖像項。架構中包含一個事件傳播架構,提供了和場景中的圖形項進行精确的雙精度互動能力,如将場景時間傳遞給圖形項,也可以管理圖形項目之間的事件傳播。
圖形項可以處理鍵盤事件,滑鼠事件,如滑鼠按下事件、移動、釋放及輕按兩下事件,還可以跟蹤滑鼠的移動。
圖形視圖架構使用一個BSP(Binary Space Partitioning)樹來快速發現圖形項,正因為如此,可實時顯示巨大的場景,甚至包括上百萬個圖形項。
1、場景、視圖、圖像項
1.1、場景
一個場景分為3層:圖形項層、前景層。
場景繪制順序:背景層->圖像項層->場景層
場景作用:
提供用于管理大量圖像項的高速接口;
傳播事件到每一個圖形項;
管理圖像項的狀态,如選擇和處理焦點;
提供無變換的渲染功能,主要用于列印;
常用接口:
QGraphicsScene::setForegroundBrush()//設定前景刷
QGraphicsScene::setBackgroundBrush()//設定背景刷
QGraphicsScene::itemAt() //傳回指定坐标處最頂層的圖形項
QGraphicsScene::selectedI tems() //擷取目前選取的所有圖形項的清單
QGraphicsScene::setFocusItem() //為圖形項設定焦點
QGraphicsScene::focusItem() //擷取目前獲得焦點的圖形項
QGraphicsScene::render() //将場景中的一部分渲染到繪圖裝置上
QGraphicsScene::setSelectionArea() //傳遞一個任意形狀來選擇場景中指定的圖形項
1.2、視圖
QGraphicsView提供了視圖部件,它用來使場景中的内容可視化。可連接配接多個視圖到同一個場景來為相同的資料集提供多個視圖,視圖部件是一個可滾動的區域,提供了一個滾動條來浏覽大場景。
常用接口:
QGraphicsView::setForegroundBrush() //設定前景色
QGraphicsView::setBackgroundBrush() //設定背景色
QGraphicsView::resize() //重置視圖大小
QGraphicsView::show() //顯示視圖
QGraphicsView::setDragMode() //拖動場景,常以QGraphicsView::ScrollHandDrag為參數使光标變為手掌形狀,進而拖動場景,若以QGraphicsView::RubberBandDrag為參數可在視圖上使用滑鼠拖出橡皮筋框來選擇圖形項
示例:
【領QT開發教程學習資料,點選→「連結」←莬費領取,先碼住不迷路~】
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QGraphicsView>
int main(int argc,char* argv[]){
QApplication app(argc,argv);
//建立場景
QGraphicsScene scene;
//建立矩形圖形項
QGraphicsRectItem *item = new QGraphicsRectItem(0,0,100,100);
//場景添加圖像項
scene.addItem(item);
//為場景建立視圖
QGraphicsView view(&scene);
//設定場景前景色
view.setForegroundBrush(QColor(255,21,23,100));
//設定背景
view.setBackgroundBrush(QPixmap("picture.jpg"));
view.resize(400,400);
view.show();
return app.exec();
}
1.3、圖形項
QGraphicsItem是場景中圖像項的基類,圖形項架構為典型的形狀提供了标準的圖像項,比如矩形QGraphicsRectItem、橢圓QGraphicsEllipseItem、文本QGraphicsTextItem,自定義圖形項能發揮QGraphicsItem的強大功能。
圖形項支援如下功能:
滑鼠按下、移動、釋放、輕按兩下、懸停、滾輪和右鍵菜單事件
鍵盤輸入焦點和鍵盤事件
拖放事件
分組,使用QGraphicsItemGroup通過parent-child關系來實作。
碰撞檢測
常用接口:
QGraphicsItem::boundingRect() //傳回繪圖區域
QGraphicsItem::paint() //繪圖操作
2、坐标系統
圖形視圖架構基于笛卡爾坐标系統,一個圖像項在場景的位置和幾何形狀由X坐标和Y坐标來表示。圖形視圖架構中有3個有效的坐标系統;圖形項坐标、場景坐标、視圖坐标。
為友善使用,圖像視圖架構提供了一些便捷函數來完成3個坐标系統的映射,進行繪圖時,場景坐标對應QPainter的邏輯坐标,視圖坐标對應裝置坐标。
2.1、圖形項坐标
圖像項使用自己的本地坐标系統,坐标通常以它們的中心為原點(0,0),而這也是所有變換的中心。當建立一個自定義的圖形項時,隻需要考慮圖形項的坐标系統,QGraphicsScene和QGraphicsView會完成其它所有的轉換。
圖像項的位置是指圖像項的原點在其父圖像項或場景中的位置。如果沒有圖像項,則為頂層圖像項,其均會在場景的坐标系統中。
所有的圖像項都會使用确定的順序來進行繪制,這個順序也決定了單機場景時哪個圖像項會先獲得滑鼠的輸入。所有的圖像項都包含一個z值來設定他們的堆疊順序,一個圖像項的z值預設為0,可使用QGraphicsItem::sizeZValue()來改變一個圖像項的z值。
2.2、場景坐标
場景坐标是所有圖形項的基本坐标系統,坐标的原點在場景的中心。
3、視圖的坐标
視圖的坐标就是部件的坐标,視圖坐标的每一個機關對應一個像素,原點總是在QGraphicsView視口的左上角,而右下角是寬高。所有的滑鼠事件和拖放事件都是使用視圖坐标來接收的。
圖形視圖架構的映射函數:
4、事件處理與傳播
圖形視圖架構中的事件都是由視圖進行接收的,然後傳遞給背景,再由背景傳遞給響應的圖像項。
對于鍵盤事件,會傳遞給獲得焦點的圖像項,若場景中沒有獲得焦點,則鍵盤事件被丢棄。可通過setFocus()擷取焦點。
一個圖像項可以接收懸停事件,當滑鼠進入它的區域之中時,它就會收到一個QGraphicsSceneHoverEnter事件,滑鼠在圖像項的區域移動時,QGraphicsScene就會向該圖像項發送GraphicsSceneHoverLeave事件,可通過QGraphicsItem::setAcceptHoverEvents()視圖圖像項接收懸停事件(預設不接收)。
5、碰撞檢測
圖像視圖架構提供了圖像項之間的碰撞檢測,碰撞檢測可以使用兩種方法來實作:
1.重寫QGraphicsItem::shape()函數來傳回圖像項準确的形狀,然後使用collidesWithItem()接口通過兩個圖像項形狀之間的交集來判斷是否發生碰撞。如果沒有重新實作shape()函數,則它會調用預設boundingRect()函數傳回一個簡單的矩形。
2.重寫collidesWithItem()來提供一個自定義的圖形碰撞算法。
collidesWithItem()判斷是否與指定的圖形項進行了碰撞;
collidesWithPath()判斷是否與指定的路徑碰撞;
collidingItems()擷取與該圖形項碰撞的所有圖形項的清單;
下面這幾個函數都有一個Qt::ItemSelectionMode參數來指定怎樣進行圖形項的選取,選取模式如下:
6、動畫架構
動畫架構的目的是提供一種簡單的方法來建立平滑的、具有動畫效果的GUI界面。該架構是通過控制Qt的屬性來實作動畫的,可以應用在視窗的部件和其他QOBject對象上,也可以應用在圖像視圖架構中。
動畫架構的主要類關系圖如下:
6.1、緩和曲線
使用 enum QEasingCurve::Type來設定緩和曲線,枚舉值如下:
6.2、動畫組
使用QAnimationGroup類可以實作複雜的動畫,它的兩個子類
QSequentialAnimationGroup,
QParalleAnimationGroup
分别提供了串行動畫組和并行動畫組。
7、狀态機架構
狀态機架構提供一些類來建立和執行狀态圖,狀态圖為一個系統如何對外界進行反應提供了一個圖形化模型,該模型通過定義一些系統可能進入的狀态以及系統怎樣從一個狀态切換到另一個狀态來實作的。
Qt的事件系統來驅動狀态機。