2011-07-17 2 views
0

내가이 QGraphicsScene에 개체를 추가하는 데 사용하는 개체의 목록이 다음 GraphicsScene 클래스에서, 나중에다시 데이터 모델에 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); 
} 

을, 나는 때 감지 사용자가 항목을 클릭하고 이동을 드래그 :

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

가장 좋은 방법은 목록의 항목과 장면의 항목을 수동으로 동기화 할 필요가없는 방법입니다.
가장 좋은 방법은 디자인에 따라 다릅니다. 항목이 장면의 항목에 대한 포인터가 될 수도 있고 저장할 수도 있습니다.