![](/img/trans.png)
[英]Passing event from QGraphicsScene to QGraphicsItem in C++ with Qt
[英]Get the actual object from QGraphicsItem Qt C++
我的代碼在鼠標事件中調用items(event->pos())
時成功返回了QList<QGraphicsItem *>
。 代碼如下:
QList<QGraphicsItem *> itemsList = items(event->pos());
qDebug() << itemsList;
鼠標事件的調試輸出,其中兩個對象相互重疊:
(QGraphicsItem(this =0x10ab8c900, parent =0x0, pos =QPointF(180, 0) , z = 0 , flags = ( ) ) ,
QGraphicsItem (this = 0x10159a800 , parent = 0x0 , pos = QPointF(180, 0) , z = 0 , flags = ( ) ) )
獲得位置等是完全可以的,但是有沒有辦法獲得實際的對象實例? 我看到this
參數帶有內存地址,所以我想我知道內存位置。 但是我如何將其映射到對象?
我知道后面的QGraphicsItem實例的類型為Treasure *
,我從列表中獲取了它之后嘗試了一些方法,但是似乎沒有辦法解決。 這有可能嗎?
問題是您的函數返回了QGrapihcsItem *的列表。 而您需要“寶藏*”實例。 由於Treasure繼承了QGraphicsItem,因此您可以在這種情況下應用向下轉換。 看起來像這樣:
QGraphicsItem * result;
Treasure* myTreasure = dynamic_cast<Treasure>(result);
if(myTreasure)
{
//only do something if the cast is a succes
}
在您提出問題的對話中,我收集了您想要復制的對象。 假設您要復制i
給定的索引。 這將是實現這一目標的方法:
int i = 0;
Treasure myTreasure(*itemsList[index]);
但是,可以通過類型禁用此行為。 這樣,仍然可以像下面這樣進行瑣碎的復制:
Treasure myTreasure;
memcpy(&myTreasure, itemList[index], sizeof(Treasure);
但是,我強烈建議不要這樣做。 由於這可能是未定義的行為 。
PS我想再次提到,通常情況下,復制對象的唯一情況是要保留該對象供本地使用。 也就是說,您想要更改它,以使更改不會反映在原始實例中。 或者,您想保持對象所在的狀態,而不希望更改原始對象而影響您的對象。
出於幾乎所有其他目的,通過指針訪問對象與創建副本一樣強大且有用,甚至更多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.