Qt開發技術:圖形檢視框架(二)場景QGraphicsScene、QGraphicsItem與QGraphicsView詳解

紅胖子(紅模仿)發表於2021-06-07

前話

  Qt的圖形檢視框架,最核心的三個類為:QGraphicsScene、QGraphicsItem與QGraphicsView。

 

基於圖形框架的高階白板軟體Demo

 

 

 

QGraphicsScene

描述

  QGraphicsScene類提供了一個用於管理大量二維圖形項的面。
  該類用作QGraphicsItems的容器。它與QGraphicsView一起用於在二維面上視覺化圖形項,例如線條、矩形、文字,甚至自定義項。QGraphicsScene是圖形檢視框架的一部分。
  QGraphicScene還提供了一些功能,可以讓有效地確定專案的位置,以及確定在場景中任意區域內哪些專案可見。使用QGraphicsView小部件,可以視覺化整個場景,或者放大並只檢視場景的部分。
  示例:

QGraphicsScene *pScene = new QGraphicsScene();
pScene->addText("Hello, world!");
QGraphicsView *pView = new QGraphicsView(pScene, this);

  在這裡插入圖片描述
  請注意,QGraphicScene本身沒有視覺外觀;它只管理專案。需要建立一個QGraphicsView小部件來視覺化場景(設定它的父類為可視視窗,如QWidget)。
  要將專案新增到場景中,首先要構造一個QGraphicsScene物件。然後,有兩個選項:要麼通過呼叫addIitem()新增現有的QGraphicsItem物件(主要是自定義繼承的QGraphicsItem),要麼呼叫便利函式addEllipse()、addLine()、addPath()、addPixmap()、addPolygon()、addRect()或addText(),這些函式都返回指向新新增項的指標。使用這些函式新增的專案的尺寸是相對於專案的座標系的,並且專案位置在場景中初始化為(0,0)。
  然後可以使用QGraphicsView視覺化場景。當場景更改時(例如,當專案移動或轉換時),QGraphicScene會發出changed()訊號。若要刪除項,請呼叫RemoveItem()。
  QGraphicScene使用索引演算法來有效地管理專案的位置。預設情況下,使用BSP(二進位制空間分割槽)樹;該演算法適用於大多數專案保持靜態(即不移動)的大型場景。可以通過呼叫setItemIndexMethod()來選擇禁用此索引。有關可用索引演算法的詳細資訊,請參閱ItemIndexMethod屬性。
  場景的邊界矩形是通過呼叫setSceneRect()設定的。專案可以放置在場景的任何位置,預設情況下,場景的大小是無限的。場景矩形僅用於內部記賬,維護場景的項索引。如果場景rect未設定,QGraphicScene將使用itemsBoundingRect()返回的所有項的邊界區域作為場景矩形。但是,itemsBoundingRect()是一個相對耗時的函式,因為它通過收集場景中每個專案的位置資訊來操作。因此,在大型場景上操作時,應始終設定場景矩形。
  QGraphicScene最大的優點之一是它能夠有效地確定專案的位置。即使現場有數百萬個專案,items()函式也可以在幾毫秒內確定專案的位置。items()有幾個過載:一個在特定位置查詢專案,一個在多邊形或矩形內或與多邊形或矩形相交的專案,等等。返回專案的列表按堆疊順序排序,最上面的專案是列表中的第一個專案。為了方便起見,還有一個itemAt()函式在給定位置返回最上面的項。
  QGraphicScene維護場景的選擇資訊。要選擇項,請呼叫setSelectionArea(),要清除當前選擇,請呼叫clearSelection()。呼叫selectedItems()以獲取所有選定項的列表。

事件處理和傳播

  QGraphicsScene的另一個職責是從QGraphicsView傳播事件。要將事件傳送到場景,可以構造繼承QEvent的事件,然後使用QApplication::SendEvent()傳送它。event()負責將事件分派給各個專案。一些常見事件由方便的事件處理程式處理。例如,按鍵事件由keypressEvent()處理,滑鼠按鍵事件由mousePressEvent()處理。
  關鍵事件傳遞到焦點專案。要設定焦點項,可以呼叫setFocusItem(),傳遞接受焦點的項,或者項本身可以呼叫QGraphicsItem::setFocus()。呼叫focusItem()以獲取當前焦點項。為了與小部件相容,場景還維護自己的焦點資訊。預設情況下,場景沒有焦點,所有關鍵事件都將被丟棄。如果呼叫了setFocus(),或者場景中的某個專案獲得焦點,則場景將自動獲得焦點。如果場景有焦點,hasFocus()將返回true,並且關鍵事件將轉發到焦點項(如果有的話)。如果場景失去焦點(即有人呼叫clearFocus()),而某個專案有焦點,則該場景將保持其專案焦點資訊,並且一旦場景恢復焦點,它將確保最後一個焦點專案恢復焦點。
  對於滑鼠懸停效果,QGraphicsScene會傳送懸停事件。如果一個項接受懸停事件(請參見QGraphicsItem::acceptHoverEvents()),則當滑鼠進入其區域時,它將收到一個QGaphicsSceneHoverCenter事件。當滑鼠繼續在專案區域內移動時,QGraphicsScene將向其傳送GraphicsSceneHoverMove事件。當滑鼠離開專案區域時,專案將收到一個GraphicsSceneHoverLeave事件。
  所有滑鼠事件都將傳遞到當前滑鼠抓取器項。如果一個專案接受滑鼠事件(請參見QGraphicsItem::acceptedMouseButtons())並接收到滑鼠按下,它將成為場景的滑鼠抓取器。它保持滑鼠抓取器,直到在沒有其他滑鼠按鈕被按下時收到滑鼠釋放為止。可以呼叫mouseGramberItem()來確定當前正在獲取滑鼠的項。

QGraphicsView

  QGraphicsView類提供一個視窗,用於顯示QGraphicsScene的內容。
  在QGraphicsView將可視內容滾動的視口中。幾何項建立場景的步驟參考,QGraphicsScene的文件,QGraphicsView圖形檢視框架的一部分。
視覺化一個場景,通過建構QGraphicsView通過物件的地址,可看QGraphicsView的建構函式,或者也可以隨後呼叫setScene()顯示。在你呼叫show(),視窗將預設將滾動到檢視中心並顯示可見的所有專案。例如:

QGraphicsScene *pScene = new QGraphicsScene();
pScene->addText("Hello, world!");
QGraphicsView *pView = new QGraphicsView(pScene, this);

  在這裡插入圖片描述
  可以使用滾動條或呼叫centerOn()顯式滾動到場景中的任何位置。通過將點傳遞給centerOn(),QGraphicsView將滾動其視區以確保該點在檢視中居中。提供了一個用於滾動到QGraphicsItem的過載,在這種情況下,QGraphicsView將看到該項的中心在檢視中居中。如果只想確保某個區域是可見的(但不一定是居中的),那麼可以呼叫ensureVisible()。
  QGraphicsView可以用來視覺化整個場景,或者只顯示其中的一部分。預設情況下,在首次顯示檢視時自動檢測視覺化區域(通過呼叫QGraphicsScene::itemsBoundingRect())。要自己設定視覺化區域矩形,可以呼叫setScenRect()。這將適當調整滾動條的範圍。請注意,儘管場景支援幾乎不受限制的大小,但滾動條的範圍永遠不會超過整數的範圍(INT_MIN,INT_MAX)。
  QGraphicsView通過呼叫render()視覺化場景。預設情況下,通過使用常規的QPainer和預設的渲染提示將專案繪製到視區上。要在繪製項時更改QGraphicsView傳遞給QPainter的預設渲染提示,可以呼叫setRenderHints()。
  預設情況下,QGraphicsView為viewport小部件提供常規的QWidget。可以通過呼叫viewport()來訪問這個小部件,也可以通過呼叫setViewport()來替換它。要使用OpenGL進行渲染,只需呼叫setViewPort(new QGLWidget)。QGraphicsView擁有viewport小部件的所有權。
  QGraphicsView使用QTransform支援仿射轉換。可以將矩陣傳遞給setTransform(),也可以呼叫便利函式rotate()、scale()、translate()或shear()。最常見的兩種轉換是縮放,用於實現縮放和旋轉。QGraphicsView在轉換期間保持檢視中心不變。由於場景對齊(setAligment()),轉換檢視不會產生視覺影響。
  可以使用滑鼠和鍵盤與場景中的專案進行互動。QGraphicsView將滑鼠和鍵事件轉換為場景事件(繼承QGraphicsSceneEvent的事件),並將它們轉發到視覺化的場景。最後,處理事件並對其做出反應的是單個專案。例如,如果單擊一個可選擇的項,該項通常會讓場景知道它已被選中,並且它也會重新繪製自己以顯示一個選擇矩形。類似地,如果你點選並拖動滑鼠來移動一個可移動的專案,它就是處理滑鼠移動和移動自己的專案。項互動在預設情況下是啟用的,可以通過呼叫setInteractive()來切換它。
  還可以通過建立QGraphicsView的子類並重新實現滑鼠和鍵事件處理程式來提供自己的自定義場景互動。為了簡化如何以程式設計方式與檢視中的項進行互動,QGraphicsView提供了對映函式mapToScene()和mapFromScene(),以及項訪問器items()和itemAt()。這些函式允許在檢視座標和場景座標之間對映點、矩形、多邊形和路徑,並使用檢視座標在場景中查詢專案。

QGraphicsItem

詳細介紹

  QGraphicsItem類是QGraphicsScene中所有圖形項的基類。
  它為編寫自己的自定義專案提供了輕量級的基礎。這包括通過事件處理程式定義項的幾何體、衝突檢測、其繪製實現和項互動。QGraphicsItem是圖形檢視框架的一部分。
   在這裡插入圖片描述
  為了方便起見,Qt為最常見的形狀提供了一組標準圖形項。這些是:

  • QGraphicsEllipseItem 提供橢圓項
  • QGraphicsLineItem 提供直線項
  • QGraphicsPathItem 提供任意路徑項
  • QGraphicsPixmapItem 提供pixmap項
  • QGraphicsPolygonItem 提供多邊形項
  • QGraphicsRectItem 提供矩形項
  • QGraphicsSimpleTextItem 提供簡單的文字標籤項
  • QGraphicsTextItem 提供高階文字瀏覽器項

  (補充:若是為了深度使用,建議全部重寫一個公用積累,然後所有元素item自己寫,不使用自帶的。)
  專案的所有幾何資訊都基於其區域性座標系。項的位置pos()是唯一不在本地座標中操作的函式,因為它返回父座標中的位置。圖形檢視座標系詳細描述了座標系。
  可以通過呼叫setVisible()來設定項是否應可見(即,繪製和接受事件)。隱藏專案也會隱藏其子項。同樣,可以通過呼叫setEnabled()來啟用或禁用項。如果禁用某個專案,它的所有子項也將被禁用。預設情況下,專案既可見又啟用。若要切換是否選擇項,請首先通過設定itemIsSelectable標誌啟用選擇,然後呼叫setSelected()。通常,選擇由場景切換,這是使用者互動的結果。
  要編寫自己的圖形項,首先要建立QGraphicsItem的子類,然後從實現它的兩個純虛擬公共函式開始:boundingRect(),它返回該項繪製的區域的估計值,paint()實現實際繪製。
  示例:

class SimpleItem : public QGraphicsItem
{
public:
  QRectF boundingRect() const
  {
    qreal penWidth = 1;
    return QRectF(-10 - penWidth / 2, -10 - penWidth / 2,
                 20 + penWidth, 20 + penWidth);
  }
  void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
  {
    painter->drawRoundedRect(-10, -10, 20, 20, 5, 5);
  }
};

  boundingRect()函式有許多不同的用途。QGraphicsScene基於boundingRect()建立其項索引,QGraphicsView使用它來剔除不可見項,以及確定繪製重疊項時需要重新編譯的區域。此外,QGraphicsItem的碰撞檢測機制使用boundingRect()提供有效的截止點。collistsWithItem()中的細粒度碰撞演算法基於呼叫shape(),它以QPainterPath的形式返回專案形狀的準確輪廓。
  QGraphicScene希望所有boundingRect()和shape()項保持不變,除非通知它。如果要以任何方式更改項的幾何圖形,必須首先呼叫prepareGeometryChange()以允許QgraphicsScene更新其記賬。
  碰撞檢測有兩種方式:

  • 過載shape()返回項的準確形狀,並依賴collapsWithItem()的預設實現來進行形狀交集。如果形狀複雜的話,這可能會很貴(指效能消耗)。
  • 過載collistWithItem()提供自己的自定義項和形狀衝突演算法。

  可以呼叫contains()函式來確定項是否包含點。此函式也可以由項重新實現。contains()的預設行為基於呼叫shape()。
  項可以包含其他項,也可以包含在其他項中。所有項都可以有父項和子項列表。除非該項沒有父項,否則它的位置在父座標(即父項的區域性座標)中。父項將它們的位置及其轉換傳播到所有子項。
  在這裡插入圖片描述

轉換

  除了基礎位置pos()之外,QGraphicsItem還支援投影轉換。有幾種方法可以更改項的轉換。對於簡單的轉換,可以呼叫方便函式setRotation()或setScale(),也可以將任何轉換矩陣傳遞給setTransform()。對於高階轉換控制,還可以通過呼叫setTransforms()來設定多個組合轉換。
  專案轉換從父項到子項疊加,因此如果父項和子項都旋轉90度,子項的總轉換將為180度。類似的,如果專案的父級縮放到原始大小的2倍,則其子級也將是原始大小的兩倍。項的轉換不會影響其自身的區域性幾何圖形;所有幾何圖形函式(例如,contains()、update()和所有對映函式)仍在區域性座標中操作。為了方便起見,QGraphicsItem提供函式sceneTransform(),它返回項的總轉換矩陣(包括其位置以及所有父級位置和轉換),scenePos()返回其在場景座標中的位置。若要重置項的矩陣,請呼叫resetTransform()。
  某些轉換操作根據應用順序產生不同的結果。例如,如果縮放一個變換,然後旋轉它,可能會得到與先旋轉變換不同的結果。但是,在QGraphicsItem上設定轉換屬性的順序不會影響生成的轉換;QGraphicsItem始終以固定的、定義的順序應用這些屬性:

  • 應用項的基礎轉換(transform())
  • 按順序應用項的轉換列表(transforms())
  • 該項相對於其轉換原點旋轉(rotation(),transformOriginPoint())
  • 該項相對於其轉換原點進行縮放(scale(),transformOriginPoint())

繪製

  QGraphicsView呼叫paint()函式來繪製項的內容。該項本身沒有背景或預設填充;該項後面的內容將在該函式中未顯式繪製的所有區域中發光。可以呼叫update()來計劃重新繪製,也可以選擇傳遞需要重新繪製的矩形。根據該項在檢視中是否可見,可以重新繪製該項,也可以不重新繪製;在QGraphicsItem中沒有與QWidget::repaint()等效的項。
  項由檢視繪製,從父項開始,然後按升序堆疊子項。可以通過呼叫setZValue()來設定項的堆疊順序,並通過呼叫zValue()來測試它,其中z值較低的項在z值較高的項之前繪製。堆疊順序適用於兄弟項;父項總是在其子項之前繪製。
排序
  所有專案都以定義的、穩定的順序繪製,並且這個順序決定了當單擊場景時,哪些專案將首先接收滑鼠輸入。通常,不必擔心排序,因為專案遵循“自然順序”,遵循場景的邏輯結構。
  專案的子項堆疊在父項的頂部,兄弟項按插入順序堆疊(即,以新增到場景或新增到同一父項的相同順序)。如果新增了專案A,然後新增了B,那麼B將位於A的頂部。如果新增了C,那麼專案的堆疊順序將是A,然後新增了B,然後新增了C。
  在這裡插入圖片描述
  這個例子顯示了從拖放機器人的例子中機器人所有肢體的堆疊順序。軀幹是根項(所有其他項都是軀幹的子項或子項),因此首先繪製軀幹。接下來,畫出頭部,因為它是軀幹列表中的第一個專案。然後畫出左上臂。由於下臂是上臂的子物件,因此將繪製下臂,然後繪製上臂的下一個兄弟姐妹,即右上臂,依此類推。
  對於高階使用者,有一些方法可以更改專案的排序方式:

  • 可以對一個項呼叫setZValue()來顯式地將它堆疊在其他同級項的頂部或下方。項的預設Z值為0。具有相同Z值的項按插入順序堆疊。
  • 可以呼叫stackBefore()對子項列表重新排序。這將直接修改插入順序。
  • 可以將ItemStacksBhindParant標誌設定為將子項堆疊在其父項之後。
    兩個同級項的堆疊順序也計算每個項的子項和子項。因此,如果一個專案位於另一個專案之上,那麼它的所有子項也將位於其他專案的所有子項之上。

事件

  QGraphicsItem通過虛擬函式sceneEvent()從QGraphicsScene接收事件。此函式將最常見的事件分發給一組方便的事件處理程式:

  • contextMenuEvent()處理上下文選單事件。
  • focusInEvent()和focusOutEvent()處理焦點進入和退出事件。
  • hoverEnterEvent()、hoverMoveEvent()和hoverLeaveEvent()處理hoverEnter、move和leave事件。
  • inputMethodEvent()處理輸入事件,以獲得輔助功能支援,如中文輸入法獲取輸入內容。
  • keyPressEvent()和keyReleaseEvent()處理按鍵和釋放事件。
  • mousePressEvent()、mouseMoveEvent()、mouseReleaseEvent()和mouseDoubleClickEvent()處理滑鼠按下、移動、釋放、單擊和雙擊事件。

  可以通過安裝事件篩選器來篩選任何其他專案的事件。此功能與Qt的常規事件篩選器(請參閱QObject::InstallEventFilter())不同,後者只在QObject的子類上工作。通過呼叫InstallSceneEventFilter()將專案安裝為另一個專案的事件篩選器後,虛擬函式sceneEventFilter()將接收篩選的事件。可以通過呼叫removeSceneEventFilter()刪除項事件篩選器。

自定義資料

  有時,將自定義資料註冊到一個項、自定義項或標準項是很有用的。可以對任何項呼叫setData()以使用鍵值對(鍵為整數,值為QVariant)來儲存其中的資料。要從項中獲取自定義資料,請呼叫data()。此功能完全不受qt本身的影響;它是為方便使用者而提供的。

列舉詳解

enum QGraphicsItem::CacheMode:快取模式

  此列舉描述QGraphicsItem的快取模式。快取用於通過分配和渲染到非螢幕畫素緩衝區來加快渲染速度,當項需要重新繪製時,可以重用該緩衝區。對於某些繪製裝置,快取直接儲存在圖形記憶體中,這使得渲染非常快速。
  在這裡插入圖片描述

enum QGraphicsItem::GraphicsItemChange:通知狀態更改

  此列舉描述由QGraphicsItem::itemChange()通知的狀態更改。通知將作為狀態更改傳送,在某些情況下,可以進行調整(有關詳細資訊,請參閱每個更改的文件)。
  注意:在itemChange()內小心呼叫QGraphicsItem本身的函式,因為某些函式呼叫可能導致不需要的遞迴。例如,不能對itemPositionChange通知呼叫itemChange()中的setPos(),因為setPos()函式將再次呼叫itemChange(itemPositionChange)。相反,可以從itemChange()返回新的已調整位置。
  在這裡插入圖片描述
  在這裡插入圖片描述
  
在這裡插入圖片描述
  在這裡插入圖片描述
  在這裡插入圖片描述

enum QGraphicsItem::GraphicsItemFlag、flags QGraphicsItem::GraphicsItemFlags:表示功能項

  此列舉描述可以在項上設定的不同標誌,以切換項行為中的不同功能。預設情況下禁用所有標誌。
  在這裡插入圖片描述
  注意:此標誌類似於ItemContainChildrenInShape,但另外還通過剪下子項來強制包含。
  在這裡插入圖片描述
  注意:設定此標誌後,仍然可以縮放專案本身,並且縮放轉換將影響專案的子項。
  在這裡插入圖片描述
  在這裡插入圖片描述
  注意:如果同時設定了此標誌和ItemClipsChildrenToShape,則將強制執行剪輯。這相當於只設定ItemClipsChildrenToShape。
GRaphicsItemFlags型別是QFlags的typedef。它儲存一個或多個GraphicsItemFlag值。

enum QGraphicsItem::PanelModality:皮膚行為

  此列舉指定模式皮膚的行為。模態皮膚是阻止輸入到其他皮膚的皮膚。請注意,屬於模式皮膚子級的項不會被阻止。
  可取值為:
  在這裡插入圖片描述

成員函式(重要的幾個)

bool QGraphicsItem::acceptDrops() const

  如果item接受懸停事件(QGraphicsSceneHoverEvent)將會返回true;否則,返回false。預設情況下,圖元項沒有接受hover事件。
這個功能是在QT 4.4引入的。

bool QGraphicsItem::acceptTouchEvents() const

  如果項接受觸控事件,則返回true;否則返回false。預設情況下,專案不接受觸控事件。
  Qt4.6中引入了該功能。

Qt::MouseButtons QGraphicsItem::acceptedMouseButtons() const

  返回此項接受滑鼠事件的滑鼠按鈕。預設情況下,接受所有滑鼠按鈕。
  如果一個專案接受滑鼠按鈕,當滑鼠按鈕的滑鼠按下事件被傳遞時,它將成為滑鼠抓取專案。但是,如果專案不接受按鈕,QGraphicsScene將把滑鼠事件轉發到它下面的第一個專案。

[pure virtual] QRectF QGraphicsItem::boundingRect() const

  此純虛擬函式將項的外部邊界定義為一個矩形;所有繪製必須限制在項的邊界矩形內。QGraphicsView使用它來確定項是否需要重新繪製。
雖然專案的形狀可以是任意的,但是邊界矩形始終是矩形的,並且不受專案轉換的影響。
  如果要更改項的邊框,必須首先呼叫PrepareGeteryChange()。這將通知場景即將發生的更改,以便它可以更新其項幾何索引;否則,場景將不知道項的新幾何,並且結果未定義(通常,渲染工件留在檢視中)。
  重新實現這個函式,讓QGraphicsView確定需要重新繪製小部件的哪些部分(如果有的話)。
  注意:對於繪製輪廓/筆劃的形狀,在邊界矩形中包含一半的筆寬是很重要的。但是,不需要補償抗鋸齒。
  示例:
  在這裡插入圖片描述

QRegion QGraphicsItem::boundingRegion(const QTransform &itemToDeviceTransform) const

  返回此項的邊界區域。返回區域的座標空間取決於itemToDeviceTransform。如果將標識QTransform作為引數傳遞,則此函式將返回區域性座標區域。
  邊界區域描述了專案視覺內容的粗略輪廓。雖然計算起來很昂貴,但它也比boundingrect()更精確,並且有助於避免在專案更新時不必要的重新繪製。這對於薄專案(如直線或簡單多邊形)尤其有效。可以通過呼叫  setBoundingRegionGranularity()來調整邊界區域的粒度。預設粒度為0;其中項的邊界區域與其邊界矩形相同。
  itemTodeviceTransform是從項座標到裝置座標的轉換。如果希望此函式返回場景座標中的QRegion,可以將sceneTransform()作為引數傳遞。
  這個功能是在QT 4.4引入的。

[virtual protected] void QGraphicsItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event)

  對於事件事件,可以重新實現此事件處理程式,以接收此專案的拖曳輸入事件。當游標進入專案區域時,將生成“拖動輸入”事件。
  通過接受事件(即,通過呼叫qEvent:::accept()),專案將接受放置事件,除了接收拖動移動和拖動離開。否則,事件將被忽略並傳播到下面的項。如果該事件被接受,則在控制元件返回事件迴圈之前,該項將收到一個拖動移動事件。
  DragEnterEvent的常見實現根據事件中關聯的MIME資料接受或忽略事件。例子:
  在這裡插入圖片描述

[virtual protected] void QGraphicsItem::dragMoveEvent(QGraphicsSceneDragDropEvent *event)

  對於事件事件,此事件處理程式可以重新實現以接收此專案的拖動移動事件。當游標在專案區域內移動時,會生成拖動移動事件。大多數情況下,不需要重新實現此函式;它用於指示只有專案的部分可以接受放置。
  在事件上呼叫QEvent::Ignore()或QEvent::Accept()將切換該項是否接受從事件中刪除的位置。預設情況下,接受事件,表示專案允許在指定位置放置。
  預設情況下,專案不接收拖放事件;若要啟用此功能,請呼叫setAcceptDrops(true)。
預設實現什麼也不做。

[virtual protected] void QGraphicsItem::dropEvent(QGraphicsSceneDragDropEvent *event)

  對於事件事件,可以重新實現此事件處理程式以接收此項的放置事件。只有在最後一個拖動移動事件被接受時,項才能接收放置事件。
對事件呼叫QEvent::Ignore()或QEvent::Accept()無效。
  預設情況下,項不接收拖放事件;若要啟用此功能,請呼叫setAcceptDrops(true)。
預設實現什麼也不做。

[virtual protected] void QGraphicsItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)

  對於事件事件,可以重新實現此事件處理程式以接收此專案的滑鼠雙擊事件。
  當雙擊某個專案時,該專案將首先收到一個滑鼠按下事件,然後是一個釋放事件(即單擊),然後是一個雙擊事件,最後是一個釋放事件。
  對事件呼叫QEvent::Ignore()或QEvent::Accept()無效。
  預設實現呼叫mousePressEvent()。如果要在重新實現此函式時保留基本實現,請在重新實現中呼叫QGraphicsItem:: MouseDoubleClickevent()。
  請注意,如果一個專案既不可選擇也不可移動,它將不會接收雙擊事件(在這種情況下,滑鼠單擊將被忽略,並停止生成雙擊)。

[virtual] QPainterPath QGraphicsItem::shape() const

  返回此項的形狀作為本地座標中的QPainterPath。該形狀用於許多事情,包括碰撞檢測、命中測試和QGraphicsScene::items()函式。
  預設的實現呼叫boundingRect()返回一個簡單的矩形,但是子類可以重新實現這個函式來為非矩形項返回一個更精確的形狀。例如,圓形專案可以選擇返回橢圓形狀以更好地檢測碰撞。例如:
  在這裡插入圖片描述
  形狀的輪廓可以根據繪圖時使用的筆的寬度和樣式而變化。如果要將此輪廓包含在項的形狀中,可以使用QPainterPathStroker從筆劃建立形狀。
  此函式由contains()和collipswithpath()的預設實現呼叫。

 

上一篇:《Qt開發技術:圖形檢視框架(一)基本介紹
下一篇:敬請期待

相關文章