經過把一個item做爲另外一個item的孩子,你能夠獲得item組的大多數本質特性:這些items會一塊兒移動,全部變換會從父到子傳遞。QGraphicsItem也能夠爲它的孩子處理全部的事件,這樣就容許以父親表明它全部的孩子,能夠有效地把全部的items看做一個總體。app
另外,QGraphicsItemGroup是一個特殊的item,它既對孩子事件進行處理又有一個接口把items從一個組中增長和刪除。把一個item加到 QGraphicsItemGroup仍會保留item的原始位置與變換,而給一個item從新指定父item則會讓item根據其新的父親從新定位。能夠用QGraphicsScene::createItemGroup()建組。ide
一、經過父子關係-若是想要將 items 存儲在其餘 item 內,能夠直接將任何 QGraphicsItem 經過爲 setParentItem() 傳遞一個合適的 parent。this
注意: 對於該方式,QGraphicsItem 能夠有本身的子 item 對象。可是,QGraphicsItem 沒有 API(例如:setItems()、addChild())添加孩子,它只能容許孩子附加到 parent (setParentItem()),想一想也挺神奇的。spa
// Item parent-children.net
QGraphicsRectItem* pRectItemTmp = new QGraphicsRectItem(QRectF(-100.0, -100.0, 50.0, 50.0));code
QGraphicsEllipseItem* pEllipseItemTmp = new QGraphicsEllipseItem(QRectF(-100.0, -100.0, 50.0, 50.0));對象
pEllipseItemTmp->setParentItem(pRectItemTmp);blog
pScene->addItem(pRectItemTmp);接口
pRectItemTmp->setFlag(QGraphicsItem::ItemIsSelectable);事件
pRectItemTmp->setFlag(QGraphicsItem::ItemIsMovable);
二、QGraphicsItemGroup(圖元組)是一個容器,它的做用是將加入到該組裏的圖元當成一個圖元來看待。QGraphicsItemGroup的父類是QGraphicsItem,因此它本質上也是一個圖元,只是這個圖元自己是不可見的。
QGraphicsItemGroup有兩種建立方法:
一種是手動建立QGraphicsItemGroup對象而後再加入到場景中。
另外一種是使用場景類的createItemGroup方法建立,該方法返回一個QGraphicsItemGroup對象。
// Item Group
// [1]
QGraphicsRectItem* pRectItem = new QGraphicsRectItem(QRectF(-30.0, -30.0, 60.0, 60.0));
QGraphicsEllipseItem* pEllipseItem = new QGraphicsEllipseItem(QRectF(-30.0, -30.0, 60.0, 60.0));
QGraphicsItemGroup* pItemGroup = new QGraphicsItemGroup();
pItemGroup->setFlag(QGraphicsItem::ItemIsSelectable);
pItemGroup->setFlag(QGraphicsItem::ItemIsMovable);
pItemGroup->addToGroup(pRectItem);
pItemGroup->addToGroup(pEllipseItem);
pScene->addItem(pItemGroup);
// [2]
QGraphicsRectItem* pRectItemEx = new QGraphicsRectItem(QRectF(-30.0, -30.0, 60.0, 60.0));
QGraphicsEllipseItem* pEllipseItemEx = new QGraphicsEllipseItem(QRectF(-30.0, -30.0, 60.0, 60.0));
QList<QGraphicsItem*> pItemList;
pItemList.append(pRectItemEx);
pItemList.append(pEllipseItemEx);
QGraphicsItemGroup* pItemGroupEx = pScene->createItemGroup(pItemList);
pItemGroupEx->setFlag(QGraphicsItem::ItemIsSelectable);
pItemGroupEx->setFlag(QGraphicsItem::ItemIsMovable);
圖元組能夠使用addToGroup將圖元添加到組裏,使用removeFromGroup將圖元從組裏移除。其餘的操做就把它當成QGraphicsItem來看待。若是想要銷燬組,能夠使用場景類的destroyItemGroup方法便可。
添加和刪除Item的操做保留了Item的場景相對位置和轉換,相反,調用setParentItem(),其中僅保留子項目的父項相對位置和轉換。
QGraphicsItem 分組比較簡單,但在分組以後 group 中的 QGraphicsItem 沒法捕獲本身的相關事件(例如:鼠標事件、鍵盤事件),實際接受消息對象爲 QGraphicsItemGroup。
讓 QGraphicsItemGroup 中的 item 處理本身的事件
查看QGraphicsItemGroup源碼
QGraphicsItemGroup::QGraphicsItemGroup(QGraphicsItem *parent)
: QGraphicsItem(*new QGraphicsItemGroupPrivate, parent)
{
setHandlesChildEvents(true);
}
setHandlesChildEvents:
This function is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code.
If enabled is true, this item is set to handle all events for all its children (i.e., all events intented for any of its children are instead sent to this item); otherwise, if enabled is false, this item will only handle its own events. The default value is false.
This property is useful for item groups; it allows one item to handle events on behalf of its children, as opposed to its children handling their events individually.
If a child item accepts hover events, its parent will receive hover move events as the cursor passes through the child, but it does not receive hover enter and hover leave events on behalf of its child.