2016-07-08 6 views
0

私は複雑な関係を持つウィジェットのセットを持っています。それらのうちの1つは、ポインタとして格納しなければならないアイテムを作成する必要があります。後で作成されたもう1つのアイテムは、アイテムへのポインタ(QGraphicsScene)を受け取り、ビューに配置します。オブジェクトの所有権 - どのウィジェットがそれを削除すべきですか?

質問:近いうちに、誰がそのアイテムを削除する必要がありますか?


Widgetは:QGraphicsScene* m_scene(派生クラス)とその項目の変更を制定GUI要素を含んでいます。
MainWidgetWidgetを配置するscrollArea、QGraphicsViewを含むscrollArea、およびツールボックスを含みます。近くに - - これはウィジェットm_canvasを削除する必要があります

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Widget* w = new Widget(); 
    MainWidget m(w); 
    m.show(); 
    return a.exec(); 
} 

MainWindow:: MainWindow(Widget *contentWidget, QWidget *parent) : QWidget(parent), 
    ui(new Ui:: MainWindow), 
    m_contentWidget(contentWidget), 
    m_canvas(contentWidget->getCanvas()) 
{ 
    ui->setupUi(this); 
    ui->myView->setScene(m_canvas); 
    ui->editArea->insertWidget(0, m_contentWidget); 
} 

どちらのクラスがそう

MyCanvas *m_canvas; 

を持っている(異なるウィジェットで再利用できるように設計されていますか)?所有者である Widgetクラス、またはシーンを保持するビューを含む MainWidgetクラス?

Widgetでそれを削除 - 論理的な所有者 - 、プログラムをクラッシュさせMainWidgetはまだUIの一部としてそれを必要とするので、私の推測ではあるが)

+0

古いコードベースを維持していない場合は、既にスマートポインタを使用しているはずです。彼らは自動的に所有権の問題を解決し、結果としてそれぞれの削除を気にする必要があります。 – sergiol

+0

私はそれを理解しようとしています、私のシーンアイテムにスマートポインタを使用する方法。 – Thalia

答えて

1

ポインタの所有者はその1です削除を実行する必要があります。 Widgetが所有者であることがわかったので、リソースを削除する必要があります。


m_canvasを使用して初期化されているのでWidgetが所有者であるという合理的なようだcontentWidget->getCanvas()私はWidgetnewオペレーターと呼ばれる1であると仮定してつながる(contentWidgetはタイプWidgetのです)。

+0

はい、それは本当です - しかし、私の推測ですが、彼はまだビュー内の参照を保持しているキャンバスが削除されている場合、MainWidgetが動揺...何かが動揺し、クラッシュしています。 – Thalia

+0

@タリア私が投稿したコードにどのように問題があるかわかりません。 'ウィジェット'は決して削除されないので、 'MyCanvas'インスタンスは決して削除されないと思います。いずれにしても、他の人が使用している間、 'MyCanvas'インスタンスが存続することを確実に確認する必要があります。これは本当に問題を解決する方法を知るためには詳細が必要な別の質問です。 –

+0

@ Thalia 'MyInstance'インスタンスが削除される前に' ui-> myView-> setScene(nullptr);を実行しても問題は解決しますか? –

0

あなたのキャンバスクラスはから継承しているようです。これはQObjectから継承されています。親を持つ限り、削除は必要ありません。親オブジェクトがこれを処理します。

どちらのクラスないMyCanvasオブジェクトの親はダングリングポインタを防ぐためQPointerとのポインタを格納する必要があります。

関連する問題