一.場景(QGraphicsScene)
QGraphicsScene 提供了圖形視圖框架的場景,相當於一塊畫布,並具有以下功能。
1.一個管理大量圖形項的快速接口。
2.向每個圖形項傳播事件
3.管理圖形項的狀態,比如選擇,焦點處理等
4.提供無轉換的渲染功能,主要用於打印
簡單地一個場景使用
1 QGraphicsScene scene;//場景
2 scene.addText("Hello, world!");//添加文本圖形項
3 QGraphicsView view(&scene);//設置視圖
4 view.show();
1 addText("Hello, world!") 相當於執行了以下兩句 2
3 QGraphicsTextItem *item = new QGraphicsTextItem("Hello, world!"); 4 scene.addItem(item);
如果場景要刪除一個圖形項,可以使用
removeItem(item)
函數。
一般而言,場景層從下到上共分為3層,分別為背景層(backgroundLayer), 圖形項層(Itemlayer)與前景層(ForegroundLayer)。場景繪制總是從背景層開始,然后是圖形層,最后是前景層。
1 scene.setForegroundBrush(QColor(255,255,255,100));//前景層顏色為白色半透明
2 scene.setBackgroundBrush(Qt::green);//背景色設置為綠色
對於前景層,我們一般不進行設置,或者像上面這樣設置為半透明的白色。對於背景層,這里設置為了綠色,當然,我們也可以將一張圖片設置為背景。
scene.setBackgroundBrush(QPixmap(":/background.jpg"));
2. 場景邊界矩形
場景大小默認是沒有限制的,圖形項可以放到場景的任何位置。而場景的邊界矩形僅用於場景內部進行索引的維護。
因為如果沒有邊界矩形,場景就要搜索所有的圖形項,然后確定出其邊界,這是十分費時的。所以如果要操作一個較大的場景,我們應該給出它的邊界矩形。設置邊界矩形,可以使用setSceneRect()函數。
3.圖形項查找
場景最大的優勢之一就是可以快速的鎖定圖形項的位置,即使有上百萬個圖形項,items()函數也能在數毫秒的時間內鎖定一個圖形項的位置。items()函數有幾個重載函數來方便的進行圖形項的查找。但是有時在場景的一個點可能重疊着幾個圖形項,這時我們可以使用itemAt()函數返回最上面的一個圖形項。對於這些函數的使用,我們到后面講視圖時再舉例講解。
4.事件處理和傳播
場景可以傳播來自視圖的事件,將事件傳播給該點最頂層的圖形項。但是就像我們在講圖形項時所說的那樣,如果一個圖形項要接收鍵盤事件,那么它必須獲得焦點。而且,如果我們在場景中重寫了事件處理函數,那么在該函數的最后,必須調用場景默認的事件處理函數,只有這樣,圖形項才能接收到該事件。這一點我們也到后面講視圖時再細講。
二.視圖(QGraphicsView)
QGraphicsView 提供了視圖窗口部件,它使場景的內容可視化。你可以給一個場景關聯多個視圖,從而給一個數據集提供多個視口。視圖部件是一個滾動區域,就是說,它可以提供一個滾動條來顯示大型的場景。如果要使用OpenGL,你可以使用QGraphicsView::setViewport()函數來添加QGLWidget 。
(一)縮放與旋轉
1 QGraphicsView::scale(xScale, yScale);//在分別在x,y方向上縮放xScale,yScale倍。若為1.0倍,則不進行縮放。
2 QGraphicsView::rotate(90);//順時針旋轉90度
setAlignment(Qt::AlignLeft | Qt::AlignTop);
1 QGraphicsView::NoDrag :忽略鼠標事件,不可以拖動。 2 QGraphicsView::ScrollHandDrag :光標變為手型,可以拖動場景進行移動。 3 QGraphicsView::RubberBandDrag :使用橡皮筋效果,進行區域選擇,可以選中一個區域內的所有圖形項。
setDragMode(QGraphicsView::ScrollHandDrag);//手型拖動
scene->setSceneRect(0,0,800,800);
QGraphicsView::mousePressEvent(event);
QGraphicsView::mousePressEvent(event);
QGraphicsScene::keyPressEvent(event);
setCacheMode(QGraphicsView::CacheBackground);
QT += opengl
#include <QtOpenGL>
1 QGLWidget *widget =new QGLWidget(this); 2 setViewport(widget);
1 void MyView::mousePressEvent(QMouseEvent*event) 2 { 3 rotate(90); //視圖旋轉順時針90度
4 QPixmap pixmap(400,400); //必須指定大小
5 QPainter painter(&pixmap); 6 render(&painter,QRectF(0,0,400,400),QRect(0,0,400,400)); //打印視圖指定區域內容
7 pixmap.save("../graphicsView04/save.png"); 8 QGraphicsView::mousePressEvent(event); 9 }
scene()->render(&painter,QRectF(0,0,400,400),QRect(0,0,400,400));//打印場景內容
