내가이 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을 만든 목록 항목과 연결하는 가장 좋은 방법은 무엇입니까?
장면에 물건을 추가 할 때 item-> setData를 호출 한 다음 아이템을 가져 와서 항목을 클릭했을 때 신호를 통해 다시 전달합니다. – numegil