QT的QProcess 如何执行命令行?这个命令行中的参数中有双引号和中文。

QT框架。
下面这样的命令如何用QProcess 来调用?

ffmpeg -f gdigrab -r 25 -video_size 1366x768 -i desktop -f dshow -list_devices 0 -i video="Integrated Webcam":audio="麦克风 (Realtek Audio)" -filter_complex "[0:v] scale=1366x768 [desktop]; [1:v] scale=192x108 [webcam]; [desktop][webcam] overlay=x=W-w-50:y=H-h-50" d:\output8.mp4

上面这条命令本生是没有问题的,在windows的cmd下可以正常执行。

    QProcess p(0);
    p.start("ffmpeg -f ........此处即为上面那个命令.......");
    

但在QT中用QProcess始终没有成功。当我把含有双引号和中文的部分参数去掉后,可以成功运行命令。一旦参数含有双引号,就运行失败。

阅读 12.4k
3 个回答

以前用的一段代码

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
 
    QTime time;
    time.start();
    QProcess process;
//    process.start("J:\\NBTSCAN\\nbtscan.exe", QStringList() << "172.17.78.0/24");
//    process.start("J:\\NBTSCAN\\nbtscan.exe -v -s : 172.17.78.0/24");
    process.start("J:\\NBTSCAN\\command\\nbtscan.exe", QStringList() << "-v" << "-s" << ":" << "172.17.78.0/24");
 
    qDebug() << process.arguments();
 
    process.waitForFinished();
 
    while (process.canReadLine()) {
        qDebug() << process.readLine().trimmed();
    }
 
    qDebug() << "Using " << time.elapsed();
 
    return app.exec();
}

Qt4的文档里边明确说过(Qt5没有关注过),如果参数带引号,你用QProcess的时候,三个引号代表一个参数里边的引号

如果编译器支持C++11的化,可以试试这样写你的命令行:R"xxx(将这句中文替换为你要执行的命令行)xxx"
即字符串左边用Rxxx"(包裹,右边用)xxx"包裹,其中xxx可以替换为任意你的命令行中不存在的字符串
如果要处理中文,VS下(源码是BGK之类的)则可以用QString::fromLocal8Bit(R"(将这句中文替换为你要执行的命令行)");
如果是QtCreator下(也就是源码是UTF8格式的时候)用QString::fromUtf8(R"(将这句中文替换为你要执行的命令行)")

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏