Qt QProcess 记录

QProcess 

可用于完成启动外部程序,并与之交互通信

 

一、启动外部程序的两种方式

启动一个外部程序,需要传递外部程序的路径和执行参数,参数用QStringList来带入
//< 设置路径(必要时设置)
void QProcess::setProgram(const QString & program)

//< 设置参数(必要时设置)
void QProcess::setArguments(const QStringList & arguments)


//< 一体式:外部程序启动后,将随主程序的退出而推出
QProcess::start()   
 

//< 分离式:外部程序启动后,不会随主程序的退出而推出
QProcess::startDetached()
  • QProcess::start() 以子进程的方式打开外部程序,外部进程和现进程执行互不干扰,但外部进程的父进程是现进程。
  • QProcess::startDetached() 以分离方式打开外部程序,外部进程和现进程执行互不干扰,外部进程的父进程是系统的init进程

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

 

启动问题:出现 QProcess: Destroyed while process (".\\dfu\\DfuSe.exe") is still running. 报错

是因为它不能在函数结束之前完成,因此它显示这一条警告消息

解决方法

  • 采用指针创建对象QProcess *p
  • QProcess::execute():以阻塞方式打开外部程序,只有当外部程序执行完后才继续往后执行现程序。其中,外部程序的标准输出、标准错误都是重定向到现程序的标准输出和标准错误
(1)“QProcess: Destroyed while process (".\\dfu\\DfuSe.exe") is still running.”报错
QProcess  p ;
p->start("C:/Users/Administrator/Desktop/dfu/Release/DfuSeDemo.exe");

(2)避免(1)中的报错
QProcess*  p = new QProcess;
p->start("C:/Users/Administrator/Desktop/dfu/Release/DfuSeDemo.exe");

(3)避免(1)中的报错
QProcess  p ;
p.execute("C:/Users/Administrator/Desktop/dfu/Release/DfuSeDemo.exe");

(4)或者在另外一个类中启动外部程序即可避免(1)中的报错

 

二、启动状态

外部程序未启动时,其状态是NotRunning;
  当启动时,其状态转变为Starting,正在启动,但此时还未调用起来;
  启动之后,继续变为Running,同时发射出started()信号,此时,可以对QProcess进行读写操作了;
  当退出时,其状态改为NotRunning,并发射出finished()信号。finished()信号会携带退出码和退出状态,可以分别通过exitCode()和exitStatus()来获得。
  当发生错误时,QProcess会发出一个error()信号,同样的,也可以通过error()来获得其错误类型,通过state()获得当前程序的状态。

判断启动成功或失败

    process = new QProcess(parent);
 
    process->start("Qt.exe",NULL);
 
    if(!process->waitForStarted())
    {
        qDebug()<<"Failure!!!";
    }else
    {
        qDebug()<<"Succ!!!";
    }


三、同步API

QProcess提供了一系列的函数以提到事件循环来完成同步操作:

  • waitForStarted()      //阻塞,直到外部程序启动
  • waitForReadyRead()  //阻塞,直到输出通道中的新数据可读
  • waitForBytesWritten() //阻塞,直到输入通道中的数据被写入
  • waitForFinished()   //阻塞,直到外部程序结束

如果在主线程中调用这些函数,可能会造成当前用户界面不响应

 

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

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

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

获取main返回值

建立连接:

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

回调:

void Widget::finished(int exitCode,QProcess::ExitStatus exitStatus)
{
    qDebug()<<"finished";
 
    qDebug()<readAll());
    qDebug()<<"finished-output-readAllStandardOutput:";
    qDebug()<readAllStandardOutput());
 
}

 

五、调用cmd命令行

void Widget::testPing()
{
    QStringList arguments;
    arguments<<"/c"<<"ping www.baidu.com";//
 
    QProcess process1(this);
    process1.start("cmd.exe",arguments);
    process1.waitForStarted();
    process1.waitForFinished();
    QString strResult = QString::fromLocal8Bit(process1.readAllStandardOutput());
 
    QMessageBox msgBox(this);
    msgBox.setText(strResult);
    msgBox.exec();
}

 

你可能感兴趣的:(Qt,qt,qt5)