Qt QProcess使用总结

1、主程序:初始化及设定信号槽

1     process = new QProcess();
2  
3     connect(process,SIGNAL(started()),SLOT(started()));
4  
5     connect(process,SIGNAL(finished(int,QProcess::ExitStatus)),SLOT(finished()));
6  
7     connect(process,SIGNAL(stateChanged(QProcess::ProcessState)),SLOT(stateChanged()));

2、主程序:启动process

 1 //    QStringList list;
 2 //    list.append("hello_1");
 3 //    list.append("world_2");
 4 //    list.append("ok_3");
 5     QStringList list;
 6     list<<"hello_1"<<"world_2"<<"ok_3";
 7  
 8     QString program = "E:\\hit-qt\\build-TestCallTo-Desktop_Qt_5_8_0_MinGW_32bit-Debug\\debug\\TestCallTo.exe";
 9  
10     process->start(program,list);

3、主程序:注意start和startDetached的区别

process->startDetached(QString("E:\\hit-qt\\build-TestCallTo-Desktop_Qt_5_8_0_MinGW_32bit-Debug\\debug\\TestCallTo.exe"),list);

start是一体式的:外部程序启动后,将随主程序的退出而退出;

startDetached是分离式的:外部程序启动后,不会随主程序的退出而退出。

重要区别:如果是start则回调都可以正常接收到信息;如果是startDetached则回调无法正常接收到信息。

4、主程序:只有在外部程序退出之后才能获取到返回数据

经测试,只有在外部程序返回之后才能获取到不管是main的返回值,还是打印输出数据。

使用标准输出,任何时候都可以获得返回:

std::cout<<"it's from cout"<<std::endl;

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

5、主程序:获取main返回值

建立连接:

1 connect(process,SIGNAL(finished(int,QProcess::ExitStatus)),SLOT(finished(int,QProcess::ExitStatus)));

回调:

 1 void Widget::finished(int exitCode,QProcess::ExitStatus exitStatus)
 2 {
 3     qDebug()<<"finished";
 4  
 5     qDebug()<<exitCode;// 被调用程序的main返回的int
 6     qDebug()<<exitStatus;// QProcess::ExitStatus(NormalExit)
 7     qDebug() <<"finished-output-readAll:";
 8     qDebug()<<QString::fromLocal8Bit(process->readAll());
 9     qDebug()<<"finished-output-readAllStandardOutput:";
10     qDebug()<<QString::fromLocal8Bit(process->readAllStandardOutput());
11 }

6、主程序:获取返回输出流

建立连接:

1     connect(process,SIGNAL(finished(int,QProcess::ExitStatus)),SLOT(finished(int,QProcess::ExitStatus)));
2  
3     connect(process,SIGNAL(readyRead()),this,SLOT(readyRead()));
4  
5     connect(process,SIGNAL(readyReadStandardOutput()),this,SLOT(readyReadStandardOutput()));

回调:

 1 void Widget::finished(int exitCode,QProcess::ExitStatus exitStatus)
 2 {
 3     qDebug()<<"finished";
 4  
 5     qDebug()<<exitCode;// 被调用程序的main返回的int
 6     qDebug()<<exitStatus;// QProcess::ExitStatus(NormalExit)
 7     qDebug() <<"finished-output-readAll:";
 8     qDebug()<<QString::fromLocal8Bit(process->readAll());// ""
 9     qDebug()<<"finished-output-readAllStandardOutput:";
10     qDebug()<<QString::fromLocal8Bit(process->readAllStandardOutput());// ""
11 }
12 void Widget::readyRead()
13 {
14     qDebug()<<"readyRead-readAll:";
15     qDebug()<<QString::fromLocal8Bit(process->readAll());// "hello it is ok!"
16     qDebug()<<"readyRead-readAllStandardOutput:";
17     qDebug()<<QString::fromLocal8Bit(process->readAllStandardOutput());// ""
18 }
19 void Widget::readyReadStandardOutput()
20 {
21     qDebug()<<"readyReadStandardOutput-readAll:";
22     qDebug()<<QString::fromLocal8Bit(process->readAll());// ""
23     qDebug()<<"readyReadStandardOutput-readAllStandardOutput:";
24     qDebug()<<QString::fromLocal8Bit(process->readAllStandardOutput());// ""
25 }

经测试发现,只有在readyRead回调下面使用readAll来读取,才可以读取到数据。

7、外部程序:获取main接收参数

1     // 在这里打印参数
2     QString str1 = QString("These are the %1 arguments passed  to main:").arg(argc);
3     for(int i=1;i<argc;i++)
4     {
5         QString strN = QString("%1:%2,").arg(i).arg(argv[i]);
6         str1+=strN;
7     }
8  
9     w.SetText(str1);

8、外部程序:返回main参数

自定义返回的参数。程序会在a.exec()阻塞并在程序结束后才会执行return。

1     a.exec();// 会在这里阻塞
2  
3     return 101;

9、外部程序:返回数据

一句话即可。

要用这个:

std::cout<<"it's from cout"<<std::endl;

不要用这个:

printf("hello it is ok!");

10、process其他:stateChanged的各种状态

connect(process,SIGNAL(stateChanged(QProcess::ProcessState)),SLOT(stateChanged(QProcess::ProcessState)));

回调:

 1 void Widget::stateChanged(QProcess::ProcessState state)
 2 {
 3     qDebug()<<"show state:";
 4     switch(state)
 5     {
 6      case QProcess::NotRunning:
 7         qDebug()<<"Not Running";
 8         break;
 9     case QProcess::Starting:
10         qDebug()<<"Starting";
11         break;
12     case QProcess::Running:
13         qDebug()<<"Running";
14         break;
15     default:
16         qDebug()<<"otherState";
17         break;
18     }
19 }

11、process其他:调用命令行

 1 void Widget::testPing()
 2 {
 3     QStringList arguments;
 4     arguments<<"/c"<<"ping www.baidu.com";//
 5  
 6     QProcess process1(this);
 7     process1.start("cmd.exe",arguments);
 8     process1.waitForStarted();
 9     process1.waitForFinished();
10     QString strResult = QString::fromLocal8Bit(process1.readAllStandardOutput());
11  
12     QMessageBox msgBox(this);
13     msgBox.setText(strResult);
14     msgBox.exec();
15 }

12、判断启动成功或失败

 1     process = new QProcess(parent);
 2  
 3     process->start("TestCallTo.exe",NULL);
 4  
 5     if(!process->waitForStarted())
 6     {
 7         qDebug()<<"failure!";
 8     }else
 9     {
10         qDebug()<<"succ!";
11     }

13、用指针还是引用

(1)引用

使用过程中,发现用引用,则会出问题,比如:

 1     QProcess processCreatePdf;
 2  
 3     QStringList list;
 4     list<<"-l"<<"chi_sim"<<path<<CommonTools::getPathWithoutSuffix(path)<<"pdf";
 5  
 6     connect(&processCreatePdf,SIGNAL(started()),SLOT(onProPdfStarted()));
 7  
 8     connect(&processCreatePdf,SIGNAL(finished(int)),SLOT(onProPdfFinished()));
 9  
10     processCreatePdf.start("tesseract",list);

这样做会报错:

1 pdf-started.
2 QProcess: Destroyed while process ("tesseract") is still running.
3 pdf-finished.

started和finished是我做的调试输出,中间那一行是报错。

1 pdf-started.
2 pdf-finished.
3 code ending.

用引用类型,他会自动回收,当start执行完毕之后,程序认为QProcess已经完成使命了,自动回收,但是此时程序正在执行中,这样回收会导致强行退出,出错。

所以,如果用引用类型来做的话,必须加一个等待结束,然后才自动回收:

 1     QProcess processCreatePdf;
 2  
 3     QStringList list;
 4     list<<"-l"<<"chi_sim"<<path<<CommonTools::getPathWithoutSuffix(path)<<"pdf";
 5  
 6     connect(&processCreatePdf,SIGNAL(started()),SLOT(onProPdfStarted()));
 7  
 8     connect(&processCreatePdf,SIGNAL(finished(int)),SLOT(onProPdfFinished()));
 9  
10     processCreatePdf.start("tesseract",list);
11  
12     processCreatePdf.waitForFinished();
13  
14     qDebug()<<"code ending.";

加了最后这句话之后,他就会阻塞在那里直到回收,注意,代码在这里是阻塞的,而且是先收到finish的消息,然后这个代码才往下走:

1 pdf-started.
2 pdf-finished.
3 code ending.

(2)指针

指针不会自动回收,那么我们可以不用waitForfinished.

回收的时候可以在finish的回调里面设置:

1     processCreatePdf->deleteLater();
2  
3     processCreatePdf = NULL;

14、execute

此函数与start类似,他相当于start+waitForFinished。

此函数处于阻塞状态,与waiForFinished是一样的。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QProcess是一个 Qt 库中的类,它允许开发人员启动和控制独立的程序。它可以被用来执行命令行程序、启动其他应用程序,以及通过管道与其他程序进行通信。 以下是一个简单的 QProcess 的例程: ``` #include <QProcess> #include <QDebug> int main(int argc, char *argv[]) { QProcess process; process.start("ls", QStringList() << "-l"); process.waitForFinished(); qDebug() << process.readAllStandardOutput(); return 0; } ``` 在这个例程中,我们使用 QProcess 启动了一个 `ls` 程序,并等待它结束。最后,我们读取它的标准输出,并使用 `qDebug` 将其打印到控制台。 ### 回答2: QProcess是一个在Qt框架中用于进程管理的类。它允许我们启动外部程序,并与其进行交互。QProcess可以用于执行一些长时间运行的任务,如运行其他程序、执行数据库操作或者进行一些系统管理。 我们可以使用QProcess创建一个新的进程,然后使用它的方法来执行一些操作。例如,我们可以使用start()方法来启动一个外部程序,并使用waitForFinished()方法来等待程序执行完毕。在程序执行过程中,我们可以使用write()方法向进程的输入通道写入数据,或使用readAll()方法来读取进程的输出信息。 QProcess也提供了一些信号用于与外部程序进行交互。例如,当进程的输出信息可读取时,它会发出readyRead信号,我们可以通过连接这个信号来读取输出信息。另外,当进程执行完毕时,它会发出finished信号,我们可以通过连接这个信号来获取进程的退出状态。 使用QProcess可以很方便地实现与外部程序的交互。它提供了丰富的功能和灵活的接口,可以满足各种不同的需求。无论是需要执行一些系统命令,还是需要进行一些后台任务的操作,QProcess都可以帮助我们简化代码,提高开发效率。 综上所述,QProcess是一个强大的进程管理类,在Qt框架中广泛应用。通过使用它的方法和信号,我们可以方便地管理外部程序的执行和交互,从而实现各种复杂的功能。 ### 回答3: QProcessQt框架提供的一个类,用于执行外部程序或命令行指令。它提供了一种在Qt应用程序中调用外部程序并与其进行交互的方式。 使用QProcess可以方便地启动并控制外部程序的执行。我们可以使用它来执行任何可以在命令行中执行的程序,并从其获取输出结果以及与其进行交互。 QProcess的主要用途是执行命令行指令或启动外部可执行程序。我们可以指定要执行的程序的名称、命令行参数以及工作目录。通过调用start()函数,我们可以启动外部程序的执行。 QProcess提供了一些函数来控制执行过程,例如waitForStarted()函数可以等待程序启动、waitForFinished()函数可以等待程序执行完成。我们还可以使用kill()函数来终止外部程序的执行。 QProcess还提供了信号和槽机制,以便我们可以实时获取外部程序的运行状态和输出结果。例如,readyReadStandardOutput()信号可以在外部程序的标准输出有可读数据时被触发,我们可以通过读取标准输出缓冲区来获取外部程序的输出。 总结来说,QProcess是一个非常方便的Qt类,用于执行外部程序或命令行指令。它提供了启动和控制外部程序执行的功能,并提供了与外部程序交互的机制。通过使用QProcess,我们可以方便地在Qt应用程序中调用外部程序并与其进行交互,以实现更复杂的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值