项目做到一定阶段,常常须要在原来的project上调用外部程序。

Qt为此提供了QProcess类,QProcess可用于完毕启动外部程序,并与之交互通信。

基本用法:

    QProcess p(0);
p.start("cmd", QStringList()<<"/c"<<"ping www.baidu.com");
p.waitForStarted();
p.waitForFinished();
QString strTemp=QString::fromLocal8Bit(p.readAllStandardOutput()); //获得输出 // QMessageBox testMassage;
// testMassage.setText(strTemp);
// testMassage.exec();

另一种用法:

QProcess p(0);
QString command = "E:/test_rar_course/rar.exe";
QStringList args;
args.append("a");
args.append("-k");
args.append("-r");
args.append("-s");
args.append("-m1");
args.append("E:/test_rar_course/test.rar");
args.append("E:/test_rar_course/direct1/");
args.append("E:/test_rar_course/direct2/");
args.append("E:/test_rar_course/test.txt");
p.execute(command,args);//command是要执行的命令,args是参数
p.waitForFinished();
qDebug()<<QString::fromLocal8Bit(p.readAllStandardError()); //p.start(command, args);
//p.waitForStarted();
//p.waitForFinished();

注:

QProcess::start() 接受两个参数,第一个是要执行的命令或者程序,这里就是 notepad.exe;第二个是一个 QStringList 类型的数据,也就是需要传递给这个程序的运行参数。注意,这个程序是需要能够由系统找到的,一般是完全路径。

1-不带空格。能够启动

process->start("F:/AppInst/115/115com/115com.exe");

2-带空格,无法启动

process->start("C:/Program Files/HaoZip/HaoZip.exe");

3-带空格,使用带參模式。能够启动

process->start("C:/Program Files/HaoZip/HaoZip.exe", QStringList("C:/Program Files/HaoZip/HaoZip.exe"));
一个完整的例子

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QtGui> class MainWindow : public QMainWindow
{
Q_OBJECT public:
MainWindow(QWidget *parent = 0);
~MainWindow(); private slots:
void openProcess();
void readResult(int exitCode); private:
QProcess *p;
}; #endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"  

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
p = new QProcess(this);
QPushButton *bt = new QPushButton("execute notepad", this);
connect(bt, SIGNAL(clicked()), this, SLOT(openProcess()));
} MainWindow::~MainWindow()
{ } void MainWindow::openProcess()
{
p->start("cmd.exe", QStringList() << "/c" << "dir");
connect(p, SIGNAL(finished(int)), this, SLOT(readResult(int)));
} void MainWindow::readResult(int exitCode)
{
if(exitCode == 0) {
QTextCodec* gbkCodec = QTextCodec::codecForName("GBK");
QString result = gbkCodec->toUnicode(p->readAll());
QMessageBox::information(this, "dir", result);
}
}

在按钮点击的 slot 中,我们通过 QProcess::start() 函数运行了指令:

cmd.exe /c dir

这里是说,打开系统的 cmd 程序,然后运行 dir 指令。如果有对参数 /c 有疑问,只好去查阅 Windows 的相关手册了哦,这已经不是 Qt 的问题了。然后我们 process 的 finished() 信号连接到新增加的 slot 上面。这个 signal 有一个参数 int。我们知道,对于 C/C++ 程序而言,main() 函数总是返回一个 int,也就是退出代码,用于指示程序是否正常退出。这里的 int 参数就是这个退出代码。在 slot 中,我们检查退出代码是否是0,一般而言,如果退出代码为0,说明是正常退出。然后把结果显示在 QMessageBox 中。怎么做到的呢?原来,QProcess::readAll() 函数可以读出程序输出内容。我们使用这个函数将所有的输出获取之后,由于它的返回结果是 QByteArray 类型,所以再转换成 QString 显示出来。另外注意一点,中文本 Windows 使用的是 GBK 编码,而 Qt 使用的是 Unicode 编码,因此需要做一下转换,否则是会出现乱码的,大家可以尝试一下。

好了,进程间交互就说这么说,通过查看文档你可以找到如何用 QProcess 实现进程过程的监听,或者是令Qt 程序等待这个进程结束后再继续执行的函数。

【更多参考】

Qt 中用QProcess调用cmd命令的更多相关文章

  1. QT中QProcess调用命令行的痛苦经历(调用Winrar,设置工作目录,获得输出,注意引号与括号,等等)

    QT中QProcess调用命令行的痛苦经历   阅读目录 创建压缩包的方法 在QT中调用命令行 在QT中调用C++创建的dll 在QT程序中需要将某些目录和文件压缩为一个rar的压缩包,于是想到了在Q ...

  2. 使用node自动生成html并调用cmd命令提交代码到仓库

    生成html提交到git仓库 基于目前的express博客,写了一点代码,通过request模块来请求站点,将html保存到coding-pages目录,复制静态文件夹到coding-pages,最后 ...

  3. python调用cmd显示中文乱码及调用cmd命令

    os.system('dir') 解决方法加上 os.system('chcp 65001') ____________________________________________________ ...

  4. C语言调用Cmd命令以及执行系统软件

    C语言调用Cmd命令以及执行系统软件 http://blog.csdn.net/qq_16814591/article/details/43676377

  5. IE浏览器中使用js调用cmd命令行demo

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...

  6. Python调用cmd命令

    常用的两种方式: 1.python的OS模块. OS模块调用CMD命令有两种方式:os.popen(),os.system(). 都是用当前进程来调用. os.system是无法获取返回值的.当运行结 ...

  7. QT中QProcess调用命令行的痛苦经历

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

  8. C# 调用cmd命令行路径中带空格问题

    今天打包winform程序,程序中本身有一处需要调用cmd.exe,打包安装在C:\Program Files目录下,然后调用cmd的地方,就弹出了C:\Program不是内部或外部命令,也不是可运行 ...

  9. Java调用CMD命令

    java的Runtime.getRuntime().exec(commandStr)可以调用执行cmd指令. cmd /c dir 是执行完dir命令后关闭命令窗口. cmd /k dir 是执行完d ...

随机推荐

  1. 《JAVA编程思想》第四版 PDF

    感谢,参考:https://www.cnblogs.com/buwuliao/p/8073211.html 一.链接: 中文版: https://pan.baidu.com/s/1d07Kp4 密码: ...

  2. java 三大框架 struct2部分 实现增删该查操作

    1.三层架构    表现层:接收和处理请求.        MVC模型:它是一个表现层模型.    业务层:处理程序业务需求.    持久层:对数据库操作的.2.MVC模型    M:Model   ...

  3. php直接执行linux 命令

    注意你可以使用的命令只能是php这个用户组的权限和范围,注意这个linux 执行的,windows也是可以对应dos命令,但是打印格式不是很好看 //$output = `ls -al`; //$ou ...

  4. DATEADD日期函数的使用

    在当前日期加上几天:https://www.cnblogs.com/shitaotao/p/7648198.html 计算本月的第一天:https://www.cnblogs.com/lcyuhe/p ...

  5. 线程安全 Thread Safety Problem scala concurrency 并发

    小结: 1.基于java并发模型 Scala concurrency is built on top of the Java concurrency model. 2. 将每个请求放入一个新的线程 T ...

  6. mysql in 排序 也可以按in里面的顺序来排序

    SQL: select * from table where id IN (3,9,6);这样的情况取出来后,其实,id还是按3,6,9,排序的,但如果我们真要按IN里面的顺序排序怎么办?SQL能不能 ...

  7. VoiceXML简介

    简单来说,VoiceXML就是语音网络世界的HTML,一种用于语音应用的开放标准的标记语言.VoiceXML的问世使得为HTML发展起来的web体系也能够轻松地创建和使用语音应用. 发展历史: 199 ...

  8. 2019.04.13 python基础

    第一节    主要讲python背景  没什么要注意的  了解记住概念就好 python官网  python.org  自带shell  可以运行python代码 在IDLE中怎么运行代码 新建文本  ...

  9. web项目的一些常用设置

    给项目取别名: 03

  10. 《linux就该这么学》第九节课:第七章,RAID阵列和LVM逻辑卷技术

    笔记 (借鉴请改动) 7.1.RAID(独立冗余磁盘阵列) 常见的几种RAID:RAID0,RAID1,RAID5,RAID10   raid0  实现写入速度但安全性略低. raid1 实现了速度和 ...