2

私は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
}
4

2 に答える 2

3

removeWidget()を呼び出した後、。を使用してオブジェクトを削除しますdelete yourWidgetPointer;。QObjectのデストラクタは、子の親からの登録解除を処理します。

于 2012-07-22T10:13:07.310 に答える
0

QObjectがヒープ上に作成される(つまり、newで作成される)場合、ツリーはそれらから任意の順序で構築でき、後で、ツリー内のオブジェクトは任意の順序で破棄できます。ツリー内のQObjectが削除されると、オブジェクトに親がある場合、デストラクタはオブジェクトをその親から自動的に削除します。オブジェクトに子がある場合、デストラクタは各子を自動的に削除します。破棄の順序に関係なく、QObjectが2回削除されることはありません。

ここから撮影。

何を求めているのかわかりません。オブジェクトを削除すると、その親から削除されてから、その子が削除されます(これにより、削除するオブジェクトからサブツリーがカスケードされます)。deleteツリーの任意の場所で(を使用して)削除できるはずなので、セグメンテーション違反の原因となる呼び出しているコードを示してください。ツリーは自動的QObjectに再編成されます。

于 2012-07-22T10:06:52.157 に答える