2012-04-18 69 views
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文件时,其中的任何更改都会被删除。

回答

1

QObject的所有实例在被删除时发出destroyed(QObject*)信号。将ProcessMessage的信号连接到其他持久对象的插槽,然后从那里删除您的堆对象。

参考:Qt documentation for QObject

1

你可以deleteDialog对象在ProcessMessage的析构函数中。

您必须记录这一点,以明确ProcessMessage负责Dialog。请注意,这似乎不是一个好主意。这里最好的办法是手动删除这两个对象,当你完成它们。没有任何限制任何人在自动存储器中创建Dialog,尝试删除时可能导致未定义的行为。

+0

问题是,UI :: DialogProcessMessage直接由UI文件创建和更改您的加载UI文件的类UI时:: DialogProcessMessage会丢失。此外,我不知道如何手动删除对象对话框,因为它需要使用,直到对象ProcessMessage关闭。并且:ProcessMessage是一个我无法定义的QDialogs类对象。 – Streight 2012-04-18 14:52:20

2

您需要继承QDialog子类,在创建子对象的新类中添加字段,并在您的CustomNewSubclassedQDialog被销毁时添加析构函数以释放子代理的内存。

+0

没有子类化没有稳定的方法吗?我的意思是,我只想删除对象'Dialog'。 – Streight 2012-04-18 14:35:38

+0

您可以使用boost:smart_ptr来处理这个ref或scoped_ptr,但是您必须详细了解它们的工作方式以及它们的含义。例如 例如。你可以有shared_ptr,你可以在这里阅读更多http://www.boost.org/doc/libs/1_49_0/libs/smart_ptr/shared_ptr.htm – 2012-04-18 15:12:20

1

Ui::DialogProcessMessage您自己的一类吗?它是从QObject派生的吗?如果是这样,请将ProcessMessage指针作为parent传递给Dialog构造函数。 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以获取更多信息。

+0

是的,'Ui :: DialogProcessMessage'是我自己的一类,我用QtDesigner创建它。我不确定它是否是从QObject派生出来的,因为它没有提到QObject类,但是'Ui :: DialogProcessMessage'的元素像pushButtons等至少应该从QObject派生。问题是'Ui :: DialogProcessMessage'是由ui文件直接创建的,当改变ui文件时,你添加到类'Ui :: DialogProcessMessage'将会丢失。 – Streight 2012-04-18 14:31:48

+0

然后,这是一个不同于你在你的问题中描述的情况。我认为[this](http://techbase.kde.org/Development/Tutorials/Using_Qt_Designer)应该有所帮助。 – 2012-04-19 04:56:16