我有以下源代码:
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(在关闭时删除),如何最好地删除堆对象Dialog?必须在堆上创建这两个对象。此外,类“Ui :: DialogProcessMessage”由ui文件直接创建,因此每次更改ui文件时都会删除其中的任何更改。
答案 0 :(得分:2)
你需要子类化QDialog,在你的子对象的新类中添加字段,在创建时添加它,并添加析构函数,当你的CustomNewSubclassedQDialog被破坏时,它将释放subojbects的内存。
答案 1 :(得分:1)
您可以在delete
的析构函数中Dialog
ProcessMessage
个对象。
您必须对此进行记录,以明确ProcessMessage
对Dialog
负责。请注意,这似乎不是一个好主意。这里最好的方法是在完成这两个对象后手动删除它们。没有任何限制任何人在自动存储中创建Dialog
,在尝试删除时可能会导致未定义的行为。
答案 2 :(得分: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 documentation以获取更多信息。
答案 3 :(得分:1)
QObject的所有实例在删除时都会发出destroyed(QObject*)
信号。将ProcessMessage
的信号连接到其他持久对象的插槽,然后从那里删除Dialog
堆对象。