简要介绍
QProcess可用于在当前程序中启动独立的外部程序(进程),并进行通讯,通讯原理是通过程序的输入或输出流,即通过c中的printf()和或c++的std::cout等。
函数
- void QProcess::start(const QString & program, const QStringList & arguments = {}, OpenMode mode = ReadWrite)
- void QProcess::readyReadStandardOutput()
- QByteArray QProcess::readAllStandardOutput()
- bool QProcess::waitForFinished(int msecs = 30000)
函数说明
- 启动目标程序。形参: program:目标程序启动目录,包含程序名称及后缀;arguments:参数,可以向目标程序的main()函数传递两个参数;mode:读写打开模式。
- 是个信号函数,目标程序有即时输出时触发,可用于接收目标程序的实时输出。
- 读取输出。
- 等待目标程序完成(退出),注意期间主程序会陷入冻结状态。形参:msec:等待时长,注意,该时间到期后将主动关闭目标程序,默认30000毫秒,-1时可无限时长等待。
示例
主程序:
QProcess process;
// process.setProcessChannelMode(QProcess::MergedChannels);
process.start("C:\\myapp\\ProcessTest.exe");
// 实时读取
process.connect(&process, &QProcess::readyReadStandardOutput, [&](){
qDebug() << "main - " << process.readAllStandardOutput();
});
if(process.waitForFinished(-1)){
qDebug() << "main - Process:\"" << process.program() << "\" Finished";
}
// // 或目标程序退出后读取全部
// if(process.waitForFinished(-1)){
// qDebug() << "main - " << process.readAllStandardOutput();
// } else {
// qDebug() << "main - 2";
// }
目标程序:
void Widget::on_pushButton_clicked()
{
std::cout << "Widget::on_pushButton_clicked - " << ui->lineEdit->text().toStdString() << std::endl;
std::cout << std::flush;
}
测试结果输出: