2016-11-06 21 views
1

Qtライブラリを使用してC++でアプリケーションを作成しています。セントラルウィンドウ(親)があり、必要に応じてすべての子供が立ち上げられます。これらのウィンドウは複数回開くことができますが、異なるデータを表示することができるので、オブジェクトをnewと宣言しています。ここで私が持っているものの一例である:Qt親が閉じた後に変数を削除する親

Home_Window.hpp

は は
View_Window *SomeWindow; 

Home_Window.cpp

void Home_Window::on_WindowButton_clicked() 
{ 
    SomeWindow = new View_Window(); 
    SomeWindow->show(); 
} 

私が何をしたいのか、オブジェクトを削除され、ときアプリケーションのメモリフットプリントを減らすためにウィンドウが閉じられます。私はすでに、メモリ使用量を減らすために子ウィンドウに含まれているすべてのオブジェクトを削除することができましたが、コアオブジェクトはまだ残っています.1日を通してユーザーが1000のウィンドウを開閉し、アプリケーションのフットプリントは、40〜50KBのメモリで、数MBのメモリから100 MBのメモリになります。

私はこれを達成するためのオンラインガイドを見つけることができませんでした。私はスロットと信号のペアを検討していましたが、ウィンドウが閉じているときに信号がQObject::destroyed()に送信されることがわかっています。私はこのような信号とスロットのペアを設定しようとしていませんでしたか?

ご迷惑をおかけして申し訳ございません。

答えて

3

closedのときにウィンドウを削除するには、WA_DeleteOnClose属性を設定することができます。あなたのon_WindowButton_clicked()のようなものになります。

void Home_Window::on_WindowButton_clicked() 
{ 
    View_Window* w= new View_Window(); 
    w->setAttribute(WA_DeleteOnClose); 
    w->show(); 
} 

この方法は、あなた自身をw破壊を心配する必要はありません、それはdeleteが、それが閉じているdは自動的にを取得します。あなたが使用してViewWindowへのポインタを削除しようとすることができます

+0

これはセットアップですが、View_Windowオブジェクトのコンストラクタで指定しました。いくつかのテストの後、私の心配は何もなかったように見えます。なぜなら、ウィンドウを開く回数が約8回、メモリ使用量が6.2MBから6.8MBになってしまい、そのあとウィンドウを開くたびにメモリは一定のままです。しかし、他の人にとっては非常に役に立ちます。 – humroben

+0

これが当てはまる場合は、ちょっとしたコードを書き直す必要があります – humroben

1

あなたは二つのことを行う必要があります。

  1. をウィンドウの寿命は、ウィンドウが閉じていない場合でも、管理する必要があります。

    あなたは、ある時点でその人生が終わることを知っている親に与えることができます。またはQScopedPointerまたはstd::unique_ptrを使用できます。

  2. ウィンドウは閉じても削除されなければなりません。非常に少なくとも

void Home_Window::on_WindowButton_clicked() 
{ 
    //       parent window flags  
    //       vvvv vvvvvvvvvv 
    auto window = new View_Window(this, Qt::Dialog); /* 1. */ 
    window->setAttribute(Qt::WA_DeleteOnClose);  /* 2. */ 
    window->show(); 
} 

、あなたはQt::Windowフラグを設定する必要があります。 Qt::DialogにはQt::Windowフラグが含まれており、ダイアログボックスとなることも宣言されています。その事実にはプラットフォーム固有の解釈があります。ウィンドウフラグhereの詳細については、こちらをご覧ください。

あなたView_WindowのAPIが壊れている、そしてそれは、コンストラクタへの2番目の引数としてウィンドウのフラグを取ることはありません、あなたはそれらを個別に設定する必要がある場合:

window->setWindowFlags(Qt::Dialog); 

すべてのウィジェットがQt::WindowFlagsを服用する必要がありますコンストラクタのオプションの第2引数として、ウィンドウの通常の使用を反映するデフォルト値を指定します。これはQtのすべてのウィジェットによって設定される期待です。

関連する問題