0

私は次のソースコードを持っています:

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-fileによって直接作成されるため、ui-fileが変更されるたびに、クラス「Ui::DialogProcessMessage」の変更はすべて削除されます。

4

4 に答える 4

2

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

于 2012-04-18T10:50:25.140 に答える
1

のデストラクタdeleteDialogオブジェクトを作成できます。ProcessMessage

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

于 2012-04-18T10:47:20.917 に答える
1

Ui::DialogProcessMessageあなた自身のクラスですか?それはから派生していQObjectますか?その場合は、コンストラクターへのProcessMessageポインターをそのとして渡します。そうすれば、を削除する責任があります。つまり、クラスの宣言は次のようになります。DialogparentProcessMessageDialogUi::DialogProcessMessage

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

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

次に、次のように構成Dialogします。

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

詳細については、 Qtのドキュメントを参照してください。

于 2012-04-18T11:44:14.990 に答える
1

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

参照:QObjectのQtドキュメント

于 2012-04-18T15:41:02.887 に答える