2017-11-14 16 views
0

私は、単一のQGraphicsViewがそれを見て、QTimerGraphicsScene:public QGraphicsScene継承したクラスを持って、ポインタ上でdeleteLaterを呼び出した後でsegfaultを回避する方法はありますか?

void GraphicsScene::adv() 
{ 
if (actor) 
    views().at(0)->ensureVisible(actor,200,100); 
advance(); 
} 

advance()機能を呼び出すためにカチカチと、シーン上のすべてのQGraphicsItemのオブジェクトに送信されオーバーライドされたメソッドです。この機能のポイント - 私はactorが常に見えるようにしたいと思います。 actorunit:public QGraphicsPixmapItemのオブジェクトはGraphicsSceneです。

actorの方法では、私はdeleteLater()と呼んでいます。

次のタイマティック私はdeleteLater()trueとして、なぜif (actor)パス、不思議と私は何が正しい状態であるを使用する必要がありますviews().at(0)->ensureVisible(actor,200,100);ライン

SEGFAULTを受けますか?

+0

オブジェクトを削除すると、ポインタもポイントしますが、ポインタ値は自動的にnullになりません。したがって、オブジェクト 'actor'が削除されても、' if(actor) 'は引き続き通過します。 – vahancho

答えて

0

私はasynchronicallyオブジェクトdeleteLater() によって削除され、他の オブジェクトからアクセス防ぐ方法があるかしらされていますか?

はい、オブジェクトがすでにdescribedとしてQPointer<MyQObject>を使用して削除されたかどうかをプログラム的に伝える方法があります。しかし、その方法はやや遅く、アプリケーションコードはむしろそれを避けるためにより良いロジックを持つべきです。同様に、deleteLaterを呼び出す前に、あなたのコードはviews()からそのオブジェクトの参照を削除し、コードはそこにまだビューがあるかどうかチェックする必要があります。

0

actorの中からdeleteLater()を呼び出すと、コンテナGraphicsSceneにポインタが残っています。オブジェクト自体は、すべての外部ポインタをリセットしません。

このポインタ(GraphicsSceneのメンバーactor)をリセットして、if文をadv()にする必要があります。