Qt调用外部程序,启动并从中获取信息——QProcess

瞎记:今天在开发的时候遇到了程序间调用的问题,最开始的设想是使用c++来完成,后来想,既然使用Qt进行界面开发的,那能否用Qt来完成相关工作呢,于是展开了这一次旅行。

闲话少说,开始正文,先看一下大致的流程:

  1. 首先,我们通过Qt的那部分模块来实现此功能,牛曰:在`QProcess`模块当中
  2. 其次,我们应该通过怎样一个流程来完成呢,牛历后曰:两步走,首先要启动外部程序,启动之后外部程序会产生相应的动作,也就是说会产生相应的信号;最后,将接受到的信号连接到相应的处理函数上,完成相应的动作。
  3. 最后,我们来看实现

先看个简单版的,启动一个程序

 QProcess* caller = new QProcess(this);//创建对象,指定父类指针
 caller->start("notepaid.exe");//启动notepaid

    这是会弹出相应的界面,我的设置存在一些问题,启动上诉代码的时候,启动的是系统自带的记事本

再看一个稍微复杂一些的,启动一个指定程序,并想此程序传入命令参数,这个操作类似于在命令行中启动程序时带有一些参数,这里我自己制作了一个小的打印程序,就是将你给定的内容打印出来(内容不许有空格)

QProcess* caller = new QProcess(this);//创建对象,指定父类指针
caller->start("D:/exetest.exe",QStringList()<<"HelloWorld");//启动程序并传入参数

    由于制作的软件是无界面的,所以运行上述代码的时候,我是看不到任何东西的

最后看个再复杂一点的,在前一步的基础上,获取调用软件的输出(就是打印给定内容),并在当前软件中显示出来

void ExeTest::OnBtnTest()
    {
      QProcess* caller = new QProcess(this);//创建对象,指定父类指针
      caller->start("D:/exetest.exe",QStringList()<<"HelloWorld");//启动程序并传入参数
      connect(this->caller, SIGNAL(finished(int)),this,SLOT(Result(int)));//连接信号
    }
void ExeTest::Result(int a)
    {
    	if (0 == a)
    	{
    		QByteArray res = caller->readAllStandardOutput(); //获取标准输出
    		ui.Txt->appendPlainText(QString::fromLocal8Bit(res)); //打印出来
    	}
    	caller->close();
    }

    运行上述代码的时候你就可以看到在Qt界面中显示出了“HelleWorld”

是不是想问什么是标准输出?曰:类似于print,cout这种的输出,需要注意的是,输出和返回时不一样的!

是不是想问程序如何接受外部命令?曰:记得main函数声明是带有的两个参数吗,就是int main(int argc, char *argv[]),argc是参数数量,argv存放了具体的命令语句,我这里说的还不是很清楚,可以再去查一下

注意:我这里只是简单的使用,QProcess类中还有很多方法我没有用到,在进一步使用前建议把Qt官方文档中有关QProcess的介绍看一下,重点是看一下他有哪些接口

非常感谢这篇博客:https://www.cnblogs.com/findumars/p/5176315.html

你可能感兴趣的:(Qt)