本文主要是介绍QT QProcess的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、主程序:初始化及设定信号槽
process = new QProcess();
connect(process,SIGNAL(started()),SLOT(started()));
connect(process,SIGNAL(finished(int,QProcess::ExitStatus)),SLOT(finished()));
connect(process,SIGNAL(stateChanged(QProcess::ProcessState)),SLOT(stateChanged()));
2、主程序:启动process
// QStringList list;
// list.append("hello_1");
// list.append("world_2");
// list.append("ok_3");
QStringList list;
list<<"hello_1"<<"world_2"<<"ok_3";
QString program = "E:\\hit-qt\\build-TestCallTo-Desktop_Qt_5_8_0_MinGW_32bit-Debug\\debug\\TestCallTo.exe";
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;
5、主程序:获取main返回值
建立连接:
connect(process,SIGNAL(finished(int,QProcess::ExitStatus)),SLOT(finished(int,QProcess::ExitStatus)));
回调:
void Widget::finished(int exitCode,QProcess::ExitStatus exitStatus)
{
qDebug()<<"finished";
qDebug()<<exitCode;// 被调用程序的main返回的int
qDebug()<<exitStatus;// QProcess::ExitStatus(NormalExit)
qDebug() <<"finished-output-readAll:";
qDebug()<<QString::fromLocal8Bit(process->readAll());
qDebug()<<"finished-output-readAllStandardOutput:";
qDebug()<<QString::fromLocal8Bit(process->readAllStandardOutput());
}
6、主程序:获取返回输出流
建立连接:
connect(process,SIGNAL(finished(int,QProcess::ExitStatus)),SLOT(finished(int,QProcess::ExitStatus)));
connect(process,SIGNAL(readyRead()),this,SLOT(readyRead()));
connect(process,SIGNAL(readyReadStandardOutput()),this,SLOT(readyReadStandardOutput()));
回调:
void Widget::finished(int exitCode,QProcess::ExitStatus exitStatus)
{
qDebug()<<"finished";
qDebug()<<exitCode;// 被调用程序的main返回的int
qDebug()<<exitStatus;// QProcess::ExitStatus(NormalExit)
qDebug() <<"finished-output-readAll:";
qDebug()<<QString::fromLocal8Bit(process->readAll());// ""
qDebug()<<"finished-output-readAllStandardOutput:";
qDebug()<<QString::fromLocal8Bit(process->readAllStandardOutput());// ""
}
void Widget::readyRead()
{
qDebug()<<"readyRead-readAll:";
qDebug()<<QString::fromLocal8Bit(process->readAll());// "hello it is ok!"
qDebug()<<"readyRead-readAllStandardOutput:";
qDebug()<<QString::fromLocal8Bit(process->readAllStandardOutput());// ""
}
void Widget::readyReadStandardOutput()
{
qDebug()<<"readyReadStandardOutput-readAll:";
qDebug()<<QString::fromLocal8Bit(process->readAll());// ""
qDebug()<<"readyReadStandardOutput-readAllStandardOutput:";
qDebug()<<QString::fromLocal8Bit(process->readAllStandardOutput());// ""
}
经测试发现,只有在readyRead回调下面使用readAll来读取,才可以读取到数据。
4、外部程序:获取main接收参数
// 在这里打印参数
QString str1 = QString("These are the %1 arguments passed to main:").arg(argc);
for(int i=1;i<argc;i++)
{
QString strN = QString("%1:%2,").arg(i).arg(argv[i]);
str1+=strN;
}
w.SetText(str1);
5、外部程序:返回main参数
自定义返回的参数。程序会在a.exec()阻塞并在程序结束后才会执行return。
a.exec();// 会在这里阻塞
return 101;
6、外部程序:返回数据
一句话即可。
要用这个:
std::cout<<"it's from cout"<<std::endl;
不要用这个:
printf("hello it is ok!");
7、process其他:stateChanged的各种状态
connect(process,SIGNAL(stateChanged(QProcess::ProcessState)),SLOT(stateChanged(QProcess::ProcessState)));
回调:
void Widget::stateChanged(QProcess::ProcessState state)
{
qDebug()<<"show state:";
switch(state)
{
case QProcess::NotRunning:
qDebug()<<"Not Running";
break;
case QProcess::Starting:
qDebug()<<"Starting";
break;
case QProcess::Running:
qDebug()<<"Running";
break;
default:
qDebug()<<"otherState";
break;
}
}
8、process其他:调用命令行
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();
}
9、判断启动成功或失败
process = new QProcess(parent);
process->start("TestCallTo.exe",NULL);
if(!process->waitForStarted())
{
qDebug()<<"failure!";
}else
{
qDebug()<<"succ!";
}
这篇关于QT QProcess的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!