2012-04-18 14 views
0

別のヒープオブジェクトが削除されるヒープ上のオブジェクトを削除する方法:(Iは、ヒープオブジェクトのダイアログを削除するにはどうすればよい私は次のソースコードしている

void Processmethod() 
{ 
    QDialog *ProcessMessage = new QDialog;  
    Ui::DialogProcessMessage *Dialog = new Ui::DialogProcessMessage();    
    Dialog->setupUi(ProcessMessage);    //polymorphy 
    ProcessMessage->setModal(true); 
    ProcessMessage->setAttribute(Qt::WA_DeleteOnClose); 
    connect(Dialog->pushButtonAbort, SIGNAL(clicked()), &Prozess, SLOT(kill())); 
    connect(&Prozess6, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(helper())); 
    connect(&Prozess6, SIGNAL(error(QProcess::ProcessError)), this, SLOT(helper())); 
connect(this,SIGNAL(enablePushButton(bool)),Dialog->pushButtonClose, SLOT(setEnabled(bool))); 
    Prozessmeldung->setModal(true); 
    ProcessMessage->show(); 

    processmethodONE(); 
} 

は、ヒープオブジェクトProcessMessageが削除された最高います閉じたときに削除されます)?両方のオブジェクトをヒープ上に作成する必要があります。さらに、クラス "Ui :: DialogProcessMessage"は、uiファイルによって直接作成されるため、uiファイルが変更されるたびにその中の変更はすべて削除されます。

答えて

1

QObjectのすべてのインスタンスは、削除するとdestroyed(QObject*)シグナルを出します。 ProcessMessageの信号を他の永続オブジェクトのスロットに接続し、そこからDialogヒープオブジェクトを削除してください。

のRef .: Qt documentation for QObject

1

deleteDialogオブジェクトはProcessMessageのデストラクタにあります。

Dialogについては、ProcessMessageが責任を負うことを明確にするために、これを文書化する必要があります。これは良い考えのようには見えないことに注意してください。ここでの最善の方法は、両方のオブジェクトを手動で削除することです。自動ストレージにDialogを作成することを誰にも制限するものはありません。削除しようとすると未定義の動作が発生する可能性があります。

+0

問題は、UI :: DialogProcessMessageを直接UIファイルで作成され、クラス宇井にアドインをUIは、ファイルを変更する際:: DialogProcessMessageが失われてしまうということです。さらに、私は、オブジェクトProcessMessageが閉じられるまで使用される必要があるので、オブジェクトダイアログを手動で削除する方法を知らない。そして:ProcessMessageは私が定義できないQDialogsクラスオブジェクトです。 – Streight

2

QDialogをサブクラス化する必要があります。サブオブジェクトの新しいクラスにフィールドを追加する必要があります。作成するときに割り当てます。カスタムNewSubclassedQDialogが破棄された場合、サブオブジェクトのメモリを解放するデストラクターを追加します。

+0

サブクラス化なしで安定した方法はありませんか?つまり、オブジェクト 'Dialog'を削除したいだけです。 – Streight

+0

あなたはboost:smart_ptrを使ってこのrefやscoped_ptrを扱うことができますが、どのように動作するのか、そしてそれらの意味が何であるかをもっと読まなければなりません。例えば、 など。あなたはshared_ptrを持つことができます。もっと読むことができます。http://www.boost.org/doc/libs/1_49_0/libs/smart_ptr/shared_ptr.htm –

1

Ui::DialogProcessMessageは自分のクラスですか?それはQObjectから派生していますか?その場合はDialogコンストラクタへのProcessMessageポインタをparentとして渡します。そうすれば、ProcessMessageDialogの削除になります。私。あなたはより多くの情報のためQt documentationを参照したい場合があります

Ui::DialogProcessMessage *Dialog = new Ui::DialogProcessMessage(ProcessMessage); 

namespace Ui 
{ 
class DialogProcessMessage: public QDialog 
{ 
    Q_OBJECT 
public: 
    DialogProcessMessage(QObject* parent=0) : 
    QDialog(parent) 
    { /* ... */ } 

    /* 
    * more stuff ... 
    */ 
}; 
} 

そして、次のようにDialogを構築:Ui::DialogProcessMessageクラスのあなたの宣言は次のようになります。

+0

はい、 'Ui :: DialogProcessMessage'は私自身のクラスです。 QtDesignerで作成しました。 QObjectから派生したものであるかどうかは分かりませんが、QObjectクラスがないので、pushButtonsなどの 'Ui :: DialogProcessMessage'の要素は少なくともQObjectから派生する必要があります。問題は 'Ui :: DialogProcessMessage'がuiファイルによって直接作成され、uiファイルを変更するときに' Ui :: DialogProcessMessage'クラスへの追加が失われることです。 – Streight

+0

これは、あなたの質問で説明したものとは異なるシナリオです。私は[this](http://techbase.kde.org/Development/Tutorials/Using_Qt_Designer)が役立つと思います。 –

関連する問題