2012-04-18 67 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