1

画像をロードする QGraphicsView サブクラスがあります。次に、ユーザーはクリックしてドラッグすることで、その画像に線を引くことができます。

void TabView::mousePressEvent(QMouseEvent *event){
    if (event->button() == Qt::LeftButton) {
        scene->addLine(line);
    }
}

次のように、元に戻す機能を追加しました。

void TabView::mousePressEvent(QMouseEvent *event){
    if (event->button() == Qt::LeftButton) {
        lineList<<line;
        scene->addLine(lineList.last());
    }
}

void TabView::keyPressEvent(QKeyEvent * event){
    int key = event->key();
    switch(key){
        case Qt::Key_Delete:
        {
            lineList.removeLast();
            foreach(QLineF line, lineList){
                scene->addLine(line);
            }
            scene->update();
            break;
        }               
    }
}

しかし、これはうまくいきません。私はこれを試しました

case Qt::Key_Delete:
    QGraphicsLineItem *item = new QGraphicsLineItem(lineList.last());
    scene->removeItem(item);
    scene->update();
    break;

しかし、これも機能しません。

私の問題は次のとおりです: QgraphicsScene でアイテムを 1 つずつ元に戻したり削除したりするにはどうすればよいですか?

編集: これを見てください:

case Qt::Key_Delete:
{
    itemList = scene->items();
    itemList.removeLast();
    foreach(QGraphicsItem *item, itemList){
        scene->addItem(item);                   
    }
    scene->update();
    break;
}

それが機能することを期待していましたが、そうではありません。

なぜうまくいかないのか、本当に不思議です。

4

2 に答える 2

2

すでに提案したように、Qt Undo Framework が最適です。

ただし、独自の UNDO / REDO 機能を実装する場合は、元に戻す操作とやり直し操作のスタック リストを維持する必要があります。

たとえば、listUndo というスタックと listRedo というスタックを作成できます。

  • ユーザーが行を追加するたびに、またはその他の操作を行うたびに、その操作を listUndo スタックにプッシュします。また、ユーザーによるすべての操作で listRedo スタックをクリアすることを忘れないでください。

  • ユーザーが「UNDO」を押すと、listUndo スタックから最後に行われた操作がポップアウトされ、その操作が元に戻され、その操作が listRedo スタックにプッシュされます。

  • ユーザーが「REDO」を押した場合、最後に取り消された操作を listRedo スタックから取り出し、その操作をやり直して、その操作を listUndo スタックにプッシュします。

もちろん、私が言ったように、上記は少しトリッキーでバグが発生しやすいように思われるので、Qt Undo Framework の組み込み機能を使用するのが最善でしょう。

于 2013-08-24T12:10:03.537 に答える