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
のツリーのエッジがすべての場合(ブレークポイントかどうか)で実際に削除されることです。習慣になっていない彼らと何か関係がありますか?