2015-11-04 49 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