簡體   English   中英

從QGraphicsItem Qt C ++獲取實際對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM