2015-11-04 47 views
0

我開始在類的成員函數QProcessQProcess但該對象(下面的Pdf對象)很快會在創建過程後被銷燬。我顯然希望在QProcess完成時插槽函數可用並被調用。我通過QProcess指針,所以當它結束時,它也會破壞它。但實際上它在完成時並不真正被破壞。如何摧毀QProcess,當它完成和類比插槽

void PDf::createPDF() 
{ 
PdfSymlink * pdfSymlink = new PdfSymlink(fileName, linkName, myProcess); 

connect(myProcess, SIGNAL(finished(int)), pdfSymlink, SLOT(createPdfLink(int))); 

myProcess->start("sh",args); // args is defined now shown in code 
} 

這是一個重複的代碼被稱爲很多很多timesI希望當它完成了QProcess中得到破壞,同樣pdfSymlink應該被銷燬。我怎樣才能做到這一點?

請注意我的插槽沒有被調用,它做的工作,但我想確保我清理後,此對象。

回答

1

好吧,你似乎跟蹤過程對象。您可以實現createPdfLink(int)這樣的:

void createPdfLink(int status) 
{ 
    if(status != 0) 
    { 
     // Do error handling 
    } 
    else 
    { 
     // regular code 
    } 

    myProcess->deleteLater(); 
    deleteLater(); 
} 

假設myProcess的以及存儲爲myProcessPdfSymlink對象內。它一旦允許Qt刪除進程(主要是爲了防止隨機崩潰)就會導致進程被Qt刪除,並在允許的情況下導致類本身刪除。

附加:

作爲一個更乾淨的代碼,它可能是更好的包括PdfSymlink類的構造函數中connect功能:

PdfSymlink::PdfSymlink(QString fileName, QString linkName, QProcess * myProcess) 
{ 
    this->myProcess = myProcess; 
    connect(myProcess, SIGNAL(finished(int)), SLOT(createPdfLink(int))); 

    // More initialization code 
} 

這有保持代碼的額外好處相關的,並且使用重載的非靜態成員函數connect(sender,signal,method)使得「receiver」參數可選。

+0

這沒有工作,我想'deleteLater'是不像宣傳的那樣。它實際上會在QProcess完成之前銷燬錯誤消息「QProcess:銷燬進程(」sh「)仍在運行時。」如果我刪除了'deleteLater'調用,則我的QProcess會完成並生成輸出。 – zar

+0

當我回家時,我會嘗試一些東西,也許「完成」不是最好的信號使用。 – dsonck92

+0

謝謝,我有一個正在工作的解決方案,我想我會張貼,所以它可能會幫助其他人,但如果你知道更好,讓我知道 – zar

0

在插槽函數(createPdfLink())中調用disconnect()方法。請查看disconnect()的文檔。

http://doc.qt.io/qt-5/qobject.html#disconnect

因爲函數是重複性的,每次是來自它會創建一個新的信號和槽連接的功能的內部。即,如果createPDF()被調用了10次。你的槽被稱爲10次而不是一次。如果你把qDebug聲明,你可能會注意到這一點。

+0

感謝信息,但不知道這將如何解決它。 – zar

0

所以,如果有人跑進了同樣的問題,我解決它,我不得不打電話deleteLater作爲插槽:

void PDf::createPDF() 
{ 
     QProcess *myProcess= new QProcess(); 

     PdfSymlink * pdfSymlink = new PdfSymlink(fileName, linkName, myProcess); // fileName and LinkName definition is omitted 

     connect(myProcess, SIGNAL(finished(int)), pdfSymlink, SLOT(createPdfLink(int)) 
     connect(myProcess, SIGNAL(finished(int)), myProcess, SLOT(deleteLater(int))); 

     myProcess->start("sh",args); // args is defined now shown in code 
} 
+0

只要有人閱讀這個解決方案。請注意,deleteLater(int)SLOT不存在,因此實際上deleteLater從不被調用。這相當於沒有第二次連接。可能這在終端上顯示爲「無法將QProcess :: finished(int)連接到QProcess :: deleteLater(int),沒有這樣的插槽」 – dsonck92