我有一个对象列表,用于将对象添加到QGraphicsScene中:
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 :(得分:0)
最好的方法是不需要手动同步列表中的项目和场景中的项目。
最好的方法取决于你的设计 - 可能你的物品可能成为现场物品的指针,或者它们可以容纳物品。
答案 1 :(得分:0)
您可以为域对象中的每个项目分配一个QUuid
属性,并将其传递给QGraphicsItem
中的属性。我在一个项目中使用过它,它运行得很好。我在我的域模型中添加了一个QHash
查找表,以提高效率,但对于较短的列表,这不是必需的。