詳解 QT 中Graphics View柜架 (下篇)
QT 中Graphics View柜架是本文要介紹的內(nèi)容,本文分為三部分為大家介紹,本篇文章為下篇,想要繼續(xù)深入了解的請繼續(xù)關(guān)注。參考末尾。本節(jié)介紹的是詳解 QT 中Graphics View柜架 (下篇),繼續(xù)上篇 詳解 QT 中Graphics View柜架 (中篇)的內(nèi)容繼續(xù)介紹,先來看內(nèi)容
關(guān)鍵特性
縮放與旋轉(zhuǎn)
QGraphicsView通過QGraphicsView::setMatrix()支持同QPainter一樣的仿射變換,通過對一個視圖應(yīng)用變換,你可以很容易地支持普通的導(dǎo)航特性如縮放與旋轉(zhuǎn)。下面是一個例子:
- void CustomItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
- {
- QMimeData *data=new QMimeData;
- data->setColor(Qt::green);
- QDrag *drag=new QDrag(event->widget());
- drag->setMimeData(data);
- drag->start();
- }
這些槽應(yīng)與QToolButtons聯(lián)接,并使autoRepeat有效。當(dāng)對視圖變換時,QGraphicsView會對視圖中心進行校正。
拖拽
因為QGraphicsView繼承自QWidget,它也提供了像QWidget那樣的拖拽功能,另處,為了方便,Graphics View柜架也為場景,每個item提供拖拽支持。當(dāng)視圖接收到拖拽事件,它可翻譯為QGraphicsSceneDragDropEvent,再發(fā)送到場景。場景接管這個事件,把它發(fā)送到光標(biāo)下接受拖拽的***個item。
從一個item開始拖拽時,創(chuàng)建一個QDrag對象,傳遞開始拖拽的那個widget的指針。Items可以同時被多個視圖觀察,但只有一個視圖可以開始拖拽。拖拽在多數(shù)情況下是從按下鼠標(biāo)或是移動鼠標(biāo)開始的,因此,在 mousePressEvent()或mouseMoveEvent()中,你可以從事件中得到那個原始的widget指針,例如:
- void CustomItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
- {
- QMimeData *data=new QMimeData;
- data->setColor(Qt::green);
- QDrag *drag=new QDrag(event->widget());
- drag->setMimeData(data);
- drag->start();
- }
為了在場景中載取拖拽事件,你應(yīng)重新實現(xiàn)QGraphicsScene::dragEnterEvent()和在QGraphicsItem的子類里任何與你特定場景需要的事件處理器。items也可以通過調(diào)用QGraphicsItem::setAcceptDrops()獲得拖拽支持,為了處理將要進行的拖拽,你需要重新實現(xiàn)QGraphicsItem::dragEnterEvent(),QGraphicsItem::dragMoveEvent(),QGraphicsItem::dragLeaveEvent()和QGraphicsItem::dropEvent()。
光標(biāo)與工具提示
像QWidget一樣,QGraphicsItem也支持光標(biāo)(QgraphicsItem::setCursor)與工具提示(QGraphicsItem::setToolTip())。當(dāng)光標(biāo)進入到item的區(qū)域,光標(biāo)與工具提示被QGraphicsView激活(通過調(diào)用QGraphicsItem::contains()檢測)。你也可以直接在視圖上設(shè)置一個缺省光標(biāo)(QGraphicsView::setCursor)。
動畫
Graphics View支持幾種級別的動畫。你可以很容易地通過把QGraphicsItemAnimatoin與你的item聯(lián)結(jié)來
裝配出動畫路徑,這允許以時間線來控制動畫,在所有平臺上以穩(wěn)定的速率運作。QGraphicsItemAnimation允許你為item的位置,旋轉(zhuǎn),縮放,剪切,變換等產(chǎn)生一條路徑,動畫可以用QSlider來控制,或更為普遍使用的QTimeLine。
另一種是從QObject和QGraphicsItem繼承,item可以設(shè)置自己的定時器,以在QObject::timeEvent()中增加步進的方式來控制動畫。
第三種,是通過調(diào)用QGraphicsScene::advance()來推進場景,它又依次調(diào)用QGraphicsItem::advance().
OpenGL渲染
為了使用OpenGL渲染,你要設(shè)置一個新的QGLWidget作為QGraphicsView的視口:QGraphicsView::setViewPort()。假如你讓OpenGL提供反鋸齒功能,你需要OpenGL采樣緩沖支持。
- QGraphicsView view(&scene);
- view.setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
Item組
通過把一個item做為另一個item的孩子,你可以得到item組的大多數(shù)本質(zhì)特性:這些items會一起移動,所有變換
會從父到子傳遞。QGraphicsItem也可以為它的孩子處理所有的事件,這樣就允許以父親代表它所有的孩子,可以有效地把所有的items看作一個整體。
另外,QGraphicsItemGroup是一個特殊的item,它既對孩子事件進行處理又有一個接口把items從一個組中增加和刪除。把一個item加到
QGraphicsItemGroup仍會保留item的原始位置與變換,而給一個item重新指定父item則會讓item根據(jù)其新的父親重新定位??梢杂肣GraphicsScene::createItemGroup()建組。
小結(jié):詳解 QT 中Graphics View柜架 (下篇)的內(nèi)容介紹完了,希望本篇文章對你有所幫助!更所相關(guān)內(nèi)容請參考編輯推薦。