引言

随着需求的更新、程序的逐渐壮大,现在需要在应用程序中调用外部编译器,执行相关指令并获得结果。
由于Qt中使用的是C++语言,自然可以调用system去执行相关指令,但是在使用过程中发生了乱码,导致运行之后程序报错。
后来发现Qt自带的类,QProcess,毫不犹豫转到这个上面来,但是一开始还是因为不熟悉浪费了很多时间,所以想要自己整理一下思路,因为英文文档比较难读懂,所以在此尽可能多的讲解怎么使用那些常用的API,以后还会更新。

开始

Qt提供了QProcess类,这使得我们可以在应用程序中启动一个外部程序并与之交互通信。主要包括了三种启动外部命令的方式:

QProcess::start()

特点:非阻塞、一体式

void QProcess::start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite)

使用这样的启动方式之启动外部程序启动后,它会随着主程序的退出而退出。

QProcess::startDetached()

特点:分离式

void QProcess::startDetached(const QString & program, const QStringList & arguments, const QString & workingDirectory = QString(), qint64 * pid = 0)

外部程序启动后,当主程序退出时并不退出,而是继续运行。

QProcess::execute()

特点:阻塞

获取返回值
int QProcess::execute()
int QProcess::exitCode()
读取输出/到文件
// 从标准输出通道中读取数据
readAllStandardOutput()
// 从标准错误通道中读取数据
readAllStandardErrot()
// 设置输出到的文件,相当于前面的重定向
setStandardOutputFile()
// 设置错误到的文件
setStandardErrorFile()
// 读取标准输出
read()
readLine()
同步进程

QProcess提供了完成同步操作的函数:

以下方法会导致进程阻塞,直到符合其中的某一状态:

// 外部程序启动完毕
waitForStarted()
// 输出通道中的新数据是可读的
waitForReadyRead()
// 输入通道中的数据被写入完毕
waitForBytesWritten()
// 外部程序执行完毕
waitForFinished()

另外要注意的是,如果在主线程(QApplication::exec())中调用这些函数,可能会造成当前用户界面不响应1

终止
QProcess::kill()
QProcess::terminate()
QProcess::close()
注意

启动外部程序必须要传递外部程序的路径和运行參数。參数用QStringList来带入。

官方提供了分别设置路径或者参数的方法,可疑单独设置,也可以在一个方法中直接以参数的形式传入。

设置路径:

void QProcess::setProgram(const QString & program)

设置參数[可选]:

void QProcess:: setArguments(const QStringList & arguments)

示例

QObject *parent;
...
QString program = "./path/to/Qt/examples/widgets/analogclock";
QStringList arguments;
arguments << "-style" << "fusion";QProcess *myProcess = new QProcess(parent);
myProcess->start(program, arguments);
空格

当使用字符串传入一个整体命令之后,如果字符串中间有空格或者路径中文件夹中有空格,都是会失败的。
比如:

// 路径中带有空格,失败
process->start("C:/Program Files/execute.exe");// 路径中有空格,但是使用传入字符串列表的argument,成功
process->start("C:/Program Files/execute.exe", QStringList("C:/Program Files/HaoZip/HaoZip.exe"));// 或者传入空字符串,成功
QString wordPath = "C:\\Program Files\\Microsoft Office\\Office12\\WINWORD.EXE"
process->start(wordPath, QStringList() << "");

以上后两种方式成功是因为,如果使用单参数,并且路径中包含一个空格,则空格后的字符将被视为传递给可执行文件的参数。将两个参数重载,例如与空字符串一起使用,可以指定第一个参数是可执行文件的完整路径,即使它包含空格,并且后面的参数严格地作为第二个参数传递。

// 使用;或者&&同时执行两个语句,失败
process->start("ls -a && ifconfig"));// 使用字符串列表传入目标程序目录,成功
QProcess *process = new QProcess(this);
QString program = "explorer.exe";
QString folder = "C:\\";
process->start(program, QStringList() << folder);

必要的时候某些程序需要有特定的环境来能执行,通过setEnvironment()来环境变量设置,setWorkingDirectory()来设置工作目录,默认的工作路径是当前调用程序的工作路径。

例如以下程序可以实现在输入框中输入命令,点击pushButton按钮打开cmd命令行控制台执行命令的功能。2

void MainWindow::on_pushButton_clicked()
{ui->textEdit->clear();QProcess process(this);process.setProgram("cmd");QStringList argument;argument<<"/c"<<ui->lineEdit->text();process.setArguments(argument);process.start();process.waitForStarted(); //等待程序启动process.waitForFinished();//等待程序关闭QString temp=QString::fromLocal8Bit(process.readAllStandardOutput()); //程序输出信息ui->textEdit->setText(temp);
}

  1. 引用。 ↩︎

  2. 小示例 ↩︎

【Qt】QProcess的使用总结相关推荐

  1. qt QProcess

    qt QProcess QProcess常用三个函数: QProcess::execute(): 以阻塞方式打开外部程序,只有当外部程序执行完后才继续往后执行现程序.其中,外部程序的标准输出.标准错误 ...

  2. QT QProcess 关闭程序 tasklist windows

    QT程序,windows下指定程序名关闭程序,通过tasklist.exeint existProcess(QString proName) {if (!proName.endsWith(" ...

  3. Qt QProcess执行Linux 命令行的方法

    1.QProcess 打开一个bash终端,可以执行一般的命令,主要实现步骤如下 m_proces_bash = new QProcess; m_proces_bash->start(" ...

  4. 软件中打开其他软件的方式

    打开其他软件的方法 参考链接 参考链接2 QT: QProcess process;//先执行tasklist命令,获取进程列表,进而检索是否存在待启动程序的名称即可判断是否已存在.process.s ...

  5. 检测指定进程是否存在是否运行

    小总结一下c/c++检测指定进程是否存在的方式: 方式不唯一,列举本人亲测的方式,没有过多思考,简单实现. linux: //linux判断进程是否存在FILE* fp;char szbuffer[1 ...

  6. Qt之QProcess(一)运行cmd命令

    Qt提供了QProcess类,QProcess可用于完毕启动外部程序,并与之交互通信. 一.启动外部程序的两种方式: (1)一体式:void QProcess::start(const QString ...

  7. QT输入输出(四)之 QProcess

    QProcess Qt提供了一个QProcess类用于启动外部程序并与之通信.这个类是异步工作的,而且在后台执行,这样用户界面就可以始终保持响应. 启动一个新的进程的操作非常简单,只需要将待启动的程序 ...

  8. Qt笔记-QProcess切换用户执行进程(Linux)

    如下命令: /bin/su cff -c "/bin/ping 127.0.0.1" 运行截图如下: 在Qt里面使用QProcess,不需要那个双引号,如下代码: #include ...

  9. Qt工作笔记-使用Qt中QProcess与iostream中system调用外部进程

    目录 基础概念 演示 基础概念 Qt中的QProcess类可以调用外部程序! 同时iostream有个函数system也可以调用外部程序!这个system也是Windows,Linux上通用的 演示 ...

  10. qt执行命令行失败_QT中QProcess调用命令行的痛苦经历

    在QT程序中需要将某些目录和文件压缩为一个rar的压缩包,于是想到了在QT中通过QProcess类调用命令行的rar.exe来达到效果,但是没想到QProcess类用起来很麻烦,而且达不到效果,折腾了 ...

最新文章

  1. K近邻(KNN)算法是基于实例的算法,如果训练样本数量庞大,预测的时候挨个计算距离效率会很低下,如何破解?
  2. 程序员,勿让岁月偷走你年轻的秀发!
  3. Golomb及指数哥伦布编码原理介绍及实现
  4. minifilter
  5. 洛谷——P1101 单词方阵
  6. 两个分数化简比怎么化_我学《分数的意义》心得
  7. Dotnet 6.0 深度探索(一)
  8. [原]详解如何将cocos2dx项目编译到Android平台上的(方式一:Cywin+NDK)
  9. 完美实现类似QQ的自拍头像、上传头像功能!(Demo 源码)
  10. Silverlight 数据绑定 (1):怎样实现数据绑定 Silverlight 数据绑定 (2):Source to Target...
  11. 《架构探险——从零开始写javaweb框架》.pdf
  12. OSEK NM 功能测试
  13. 这是一个关于五台山关于点化顿悟的真实事件,源起偶然,其为必然,一趟旅程获得一份机缘。
  14. 猫猫回收站教程:在线撸猫~
  15. 干货分享:小程序项目实践和经验总结
  16. 我的世界JAVA挂机杀怪有经验_我的世界如何快速获得经验?
  17. 领导 - 如何培养您的团队的信心
  18. 学习笔记——day09(抽象final接口)
  19. 信号与系统公式笔记(6)
  20. 2021南京航天航空大学820自动控制原理参考答案

热门文章

  1. python线上培训班5月是淡季
  2. 解除Windows文件占用
  3. Your branch and 'origin/master' have diverged
  4. 怎样在M1 Mac上安装iPhone或iPad应用程序?
  5. Box2d For Processing
  6. 新手小白学JAVA 面向对象之多态
  7. 【化学信息学】药物的分子结构
  8. 工作杂谈(十八)——告辞信(离开第一份工作)
  9. 2020年全国硕士研究生入学统一考试管理类专业学位联考数学试题——纯题目版
  10. 在cmd下用cd命令进入不了D盘的问题