2011-07-17 17 views
0

我有我使用的對象添加到QGraphicsScene對象列表:Qt的跟蹤QGraphicsScene :: itemAt()返回數據模型

for(int i = 0; i < levelObjects.length(); i++) 
{ 
    QRect objRect; 
    objRect = spriteSheetLocations.value(levelObjects.at(i).value("frame_name")); 

    //Q_ASSERT_X(objRect != QRect(0,0,0,0), "MainWindow::loadFile()", "Could not find sprite location!"); 
    QImage img = spriteSheet.copy(objRect); 
    int height = levelObjects.at(i).value("height").toInt(); 
    int width = levelObjects.at(i).value("width").toInt(); 
    int x = levelObjects.at(i).value("x").toInt(); 
    int y = levelObjects.at(i).value("y").toInt(); 
    img = img.scaled(QSize(width, height), Qt::IgnoreAspectRatio); 
    item = scene->addPixmap(QPixmap::fromImage(img)); 
    int xPos = x - width/2; 
    int yPos = levelPlist.value("level_height").toInt() - (y + height/2); 
    item->setPos(xPos, yPos); 
} 

後來,在GraphicsScene類,我發現當用戶點擊一個項目並拖動它來移動它:

void LevelGraphicsView::mousePressEvent(QMouseEvent *event) 
{ 
    if (QGraphicsItem *item = itemAt(event->pos())) { 
     qDebug() << "You clicked on item" << item; 
     draggedItem = item; 
     int mouseX = draggedItem->pos().x() - mapToScene(event->pos()).x(); 
     int mouseY = draggedItem->pos().y() - mapToScene(event->pos()).y(); 
     mouseOffset = QPointF(mouseX, mouseY); 
    } else { 
     qDebug() << "You didn't click on an item."; 
     draggedItem = NULL; 
     mouseOffset = QPointF(0,0); 
    } 
} 

void LevelGraphicsView::mouseMoveEvent(QMouseEvent *event) 
{ 
    if(!draggedItem) // no item selected 
     return; 

    QPointF pos = mapToScene(event->pos()) + mouseOffset; 
    draggedItem->setPos(pos); 
} 

這工作正常圖形視圖移動的項目,但我無法追蹤的QGraphicsItem回到創建它的列表項。

將QGraphicsItem與製作它的列表項鍊接起來的最佳方式是什麼,以便可以更改列表項以反映位置的變化?

回答

0

您可以將您的域對象中的每個項目分配給QUuid屬性,並將其傳遞給您的QGraphicsItem中的屬性。我在一個項目中使用了它,它工作得很好。我在我的域模型中添加了一個QHash查找表,以使其更加高效,但對於較短的列表,這不是必需的。

+0

我最終做了類似的事情,當我將東西添加到場景中時,調用item-> setData,然後在單擊項目時通過信號將其恢復並傳遞迴主。 – numegil

0

最好的方法是不需要手動同步列表中的項目和場景中的項目。
要做到這一點的最好方法取決於你的設計 - 可能是你的物品可以成爲指向場景中物品的指針或者他們可以持有的物品。