如何将多参数命令以单个字符串形式传入QProcess?
关于QProcess::start参数传递的疑问
我之前用以下代码调用QProcess:
QProcess* dlvid = new QProcess; // 启动命令 QString ffmpegmerge = "ffmpeg -i myvid.mp4 -i myaudio.m4a -c copy -movflags faststart mergevid"; // 启动进程 dlvideo->start(ffmpegmerge);
这段代码能正常运行,但会收到clazy关于QProcess::start已弃用的警告。
现在我改用Qt文档推荐的新QProcess::start方法:
dlvideo->start("ffmpeg", QStringList() << "-i" << myvid << "-i" << myaudio << "-c" << "copy" << "-movflags" << "faststart" << mergevid);
注:程序中myvid、myaudio、mergevid是预先定义的QString,并非本次问题重点。
我想知道是否可以将所有参数拼接成单个QString,以类似如下形式调用start方法:
dlvideo->start("ffmpeg", QString() << "Here I want all arguments in one shot" << mergevid);
解答
不行,QProcess::start(const QString &program, const QStringList &arguments)的第二个参数要求是QStringList类型,不能直接传入单个QString。
如果想通过字符串拼接参数再转成列表,推荐用Qt提供的QProcess::splitCommand()方法,它能正确处理带空格、引号的特殊参数,避免拆分错误:
// 先拼接成完整参数字符串 QString argsStr = QString("-i %1 -i %2 -c copy -movflags faststart %3").arg(myvid).arg(myaudio).arg(mergevid); // 用splitCommand拆分合规的参数列表 dlvideo->start("ffmpeg", QProcess::splitCommand(argsStr));
不过更稳妥的方式还是直接构建QStringList,直观且不会有特殊字符的隐患:
QStringList args; args << "-i" << myvid << "-i" << myaudio << "-c" << "copy" << "-movflags" << "faststart" << mergevid; dlvideo->start("ffmpeg", args);
另外注意你之前的新代码里有冗余的QStringList(),这类写法会把空列表作为无效参数传给ffmpeg,属于错误写法,需要去掉。
内容的提问来源于stack exchange,提问作者Nasty Phoenix
相关产品推荐
相关产品推荐

