2011-07-17 3 views
0

に私はQGraphicsSceneにオブジェクトを追加するために使用するオブジェクトのリストを持っている:Qtの:: 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

最も良い方法は、リストとアイテムのシーンを手動で同期させる必要がない方法です。
これを行う最善の方法は、デザインによって異なります。あなたのアイテムは、シーンのアイテムへのポインタになることもあれば、アイテムを保持できることもあります。