4

Configurationから派生したカスタムクラス()を使用し、QGraphicsItemそのオブジェクトをに追加します。QGraphicsSceneこれは、に表示されますQGraphicsView。通常のもの。私が正確に行っているのは、複数のステップで、1つのレベルのステップで、各ノードが私のカスタムになっているツリーを描画することですQGraphicsItem

ここに画像の説明を入力してください

ここにスクリーンショットがあります。単純なケースでは、ツリーはたまたまシーケンシャルです。

最初にルートノードを描画します。ユーザーが文字列を入力した後に発生するトリガーとなるシグナル。

void MainWindow::drawRootSlot(ConfigTreeBuilder & builder)//this is a slot
{
    c_scene->clear();  //the clear cause headache. i'll expain

    Configuration* conf = new Configuration(builder.getNodesX(), builder.getNodesY(),builder.getNodesConfig());
//code
    c_scene->addItem(conf);
//code
}

後続の各Configurationスロットは、別のスロット内に描画されます。

void MainWindow::configTreeSlot(ConfigTreeBuilder & builder)    //SLOT!!!
{
    while(builder.chooseNextNode()) {

        Configuration* conf = new Configuration(builder.getNodesX(), builder.getNodesY(), builder.getNodesConfig());

       //code, while loop    
            QGraphicsLineItem *edge = c_scene->addLine(QLineF(*(parentsPoint), conf->getLeftOrigin()));
            edge->setZValue(-1); //below the Configuration item


        c_scene->addItem(conf);
    }

}

初めて実行すると、すべて正常に動作します。新しい文字列を入力してツリーをリセットすると、黒魔術が発生します。私が期待したことは、呼び出しdrawRootSlot()、ツリー全体の削除(c_scene->clear())、新しいルートノードの描画です。そして、デバッガブレークポイントをその中に置くと、drawRootSlot()まさにこれが起こります!しかし、(ブレークポイントなしで)実行すると、次のようになります。

ここに画像の説明を入力してください

前のツリーは壊れましたが、削除されませんでした。シーンは確かにそのアイテムからクリアされます(それを印刷します)が、ビューはそれを反映していません。しかし、繰り返しになりますdrawRootSlot()が、ビュー内にブレークポイントを設定すると、シーンが同期します。

c_scene->clear()空であることを保証するために、シーンオブジェクトを削除し、を呼び出す代わりに新しいオブジェクトをインストールしようとしました。次に、変更がビューに反映されます(初回の描画は常に機能します)。

だから、私はこれらの症状から何を推測するのか分かりません。ブレークポイントまたはfreshhQGraphicsSceneオブジェクトで期待どおりに機能します。を使用するだけではありませんc_scene->clear()。親オブジェクト/子オブジェクトの関係を台無しにしたと言えますが、ビューからアイテムclear() 削除されます...直後に呼び出してみましたc_scene->addItem()

この魔術は何ですか?私が実際に愚かではないと私に信じさせるものは?

編集:興味深いことであり、実際の問題のヒントになる可能性があるのは、c_scene->clear()が呼び出されると、通常QGraphicsLineItemのツリーのエッジがすべての場合(ブレークポイントかどうか)で実際に削除されることです。習慣になっていない彼らと何か関係がありますか?

4

3 に答える 3

5

わかりました、私の問題を解決QGraphicsView::viewport().update()した後に電話します。QGraphicsScene::clear()

しかし、誰かが上記の振る舞いについて説明していますか?

編集:何か他のことをしているときに、問題の実際の核心に出くわしました:boundingRect()GraphicItemsを台無しにしたので、それは可視アイテムの下にあり、その下端だけに触れました(スクリーンショットに見られるように削除されました)。したがって、現在、update()メソッドを呼び出す必要はありません。

于 2012-09-16T09:52:45.790 に答える
0

このfitInView()をgraphicsviewに対して呼び出すと、前のシーンから残っているアーティファクトからビューがクリーンアップされると思います。

于 2012-09-18T15:49:44.673 に答える
-1

シーンとグラフィックビューの両方をクリアできます

scene->clear();
ui->graphicsView->items().clear();

graphicsView=グラフィックビューの名前

このコードは、シーンビューとグラフィックビューの両方を削除します

于 2015-11-15T16:14:38.737 に答える