私はQtのドキュメントを読み、qobjectツリーをいじっています。ツリー内からウィジェットを削除してメモリからウィジェットを削除する方法があるかどうか疑問に思いました。
qwidgets / qobjectsを相互に埋め込み、ツリーを作成する場合、removeWidgetを使用してウィジェットをqlayoutsから削除すると、GUIで視覚的に削除されますが、オブジェクトは親qobjectにアタッチされたままになります(object-> parent()は0ではありません)。親が削除された場合にのみ削除されます(スコープ外になるなど)。qwidgetを破棄できるのは、アプリケーションが終了したときにのみ、最上位のウィジェットがその下にあるすべてのものを処理する場合(または、オブジェクトがスコープ外になった場合)にのみわかります。
たとえば、2つのステージがあるメインウィンドウがあるとします。最初のウィンドウには一方の親から約100個のオブジェクトが埋め込まれ、もう一方のウィンドウには200個のオブジェクトが埋め込まれています。アプリケーションはステージ1から始まり、ステージ2に移動し、ステージ1に戻ることはありません。 。これをある程度効率的にしたい場合は、ステージ1のすべてのオブジェクト(100個のオブジェクト)を強制終了しようとしますが、メインウィンドウのルートノードに接続されているため、「removeWidget」を使用しても破棄できません。
また、「new」演算子なしで作成されたウィジェットのポインターを受け取ろうとしましたが、そのオブジェクトを削除すると、デストラクタが2回呼び出されるため、アプリケーションがクラッシュしました。
私の質問は、qobjectツリー内のノードを削除する方法はありますか(そのノードはスコープ外であるため、またはアプリケーションが終了したときに削除されません)?
これがあまり意味をなさない場合は申し訳ありません。前もって感謝します。
編集:
間違った考えをしてしまったらごめんなさい。私の質問は、アプリケーションが終了する前、またはオブジェクトがスコープ外になる前に、メモリからノードを削除することです。これは例です(おそらくそれほど良くはありません)。
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Test w;
w.show();
QHBoxLayout *layout = new QHBoxLayout();
w.setLayout(layout);
Test heavyObj; //I know you can use pointers instead and that
//would allow you to easy delete the object
//but say if I did this instead.
w->addWidget(&heavyObj);
for(int i=0; i < 200; i++) {
Test obj(heavyObj);
}
w->removeWidget(&heavyObj); //At this point we don't want "heavyObj", I want
//to delete this object from memory
// is it possible to remove p1 from memory?
return a.exec();
//As stated, once the program terminates everything is destroyed
}