Qt QProcess有时会起作用,有时也不起作用

时间:2018-04-18 04:17:05

标签: c++ qt qt5 qprocess

我想通过pspdf文件转换为ps2pdf,并在Qt中输入以下代码:

QPixmap graphPng(filePath +  "report/pictures/graph-000.png");
int graphPsWidth=graphPng.width();
int graphPsHeight=graphPng.height();

//convert "ps" file to "pdf" file
QProcess process;
QStringList arg;
arg<<"-dDEVICEWIDTHPOINTS=" + QString::number(graphPsWidth)<<"-dDEVICEHEIGHTPOINTS=" + QString::number(graphPsHeight)<<"export/report/pictures/graph-000.ps"<<"export/report/pictures/graph-000.pdf";
process.start("ps2pdf",arg);
//process.waitForStarted(-1);
process.waitForFinished(-1);

(我使用png文件作为ps文件的相同维度来获取维度并将其用于创建pdf文件)

我不知道为什么有时创建pdf文件,有时没有任何输出消息(process::readAllStandardError()process::readAllStandardOutput())没有pdf个文件!

如果我在终端中立即运行pdf文件,则会创建pdf文件!!!

原因是什么?如何解决?

2 个答案:

答案 0 :(得分:1)

始终建议验证所有步骤,以便我共享更强大的代码版本。

例如,没有必要使用QPixmap,正确的方法是使用QImage。此外,还验证了文件的路径。

#include <QCoreApplication>
#include <QDir>
#include <QProcess>
#include <QImage>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QDir directory(QString("%1%2%3")
                   .arg(a.applicationDirPath())
                   .arg(QDir::separator())
                   .arg("export/report/pictures/"));

    QString name = "graph-000";
    QString png_path = directory.filePath(name + ".png");
    QString ps_path = directory.filePath(name + ".ps");

    // verify path
    Q_ASSERT(QFileInfo(png_path).exists());
    Q_ASSERT(QFileInfo(ps_path).exists());

    QString pdf_path = directory.filePath(name+".pdf");

    QImage img(png_path);
    int graphPsWidth = img.width();
    int graphPsHeight = img.height();

    QProcess process;
    QStringList arg;
    arg << QString("-dDEVICEWIDTHPOINTS=%1").arg(graphPsWidth) <<
         QString("-dDEVICEHEIGHTPOINTS=%1").arg(graphPsHeight) <<
         ps_path << pdf_path;

    process.start("ps2pdf",arg);
    process.waitForFinished();
    Q_ASSERT(QFileInfo(pdf_path).exists());
    return 0;
}

答案 1 :(得分:0)

我可以通过处理RAM来解决问题,因为如果ram超过特定限制(几乎接近RAM的全部容量),则QProcess无法启动。因此,每次诊断超出限制时,都不会创建PDF文件,反之亦然。