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 文件直接创建的,因此每次更改 ui 文件时都会删除其中的任何更改。

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

destroyed(QObject*)QObject 的所有实例在被删除时都会发出一个信号。ConnectProcessMessage的信号到其他一些持久对象的槽,并Dialog从那里删除你的堆对象。

参考:QObject 的 Qt 文档

于 2012-04-18T15:41:02.887 回答
1

Ui::DialogProcessMessage你自己的班级吗?它是从QObject? 如果是这样,将ProcessMessage指针传递给Dialog构造函数作为它的parent. 这样ProcessMessage就成为负责删除Dialog. 即你的Ui::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 回答