QT_QProcess 类启动进程并与主程序通信

[QProcess]
QProcess 类是 Qt 中专门用于启动一个外部程序进程并与主程序通信的。

[常用函数说明]
start():以子进程的方式启动外部程序,外部进程与主程序互不干扰,但外部进程的父进程就是主程序。
startDetached():以分离的方式启动外部程序,外部程序与主程序互不干扰,外部进程的父进程是系统的 init 进程。
execute():以阻塞的方式启动外部程序,只有外部程序执行完成后,主程序才会继续执行。外部程序的标准输出、标准错误都是重定向到主程序的标准输出和标准错误的。
waitForStarted():等待进程启动。
waitForFinished():等待进程结束。
readAllStandardOutput():从标准输出通道中读取数据。
readAllStandardError():从标准错误通道中读取数据。
setStandardOutputFile():设置输出到的文件,相当于前面的重定向。
setStandardErrorFile():设置错误到的文件。
read():读取标准输出。
readLine():读取标准输出的一行。

[代码]
[h]
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_PushButton_Con_clicked();
void read_dataPing();
void error_processPing();
void finished_processPing();
private:
Ui::MainWindow *ui;
QProcess *pingProcess;
void writePing(QString);
void writeKillPing(QString);
};
#endif // MAINWINDOW_H

[cpp]
#include “mainwindow.h”
#include “ui_mainwindow.h”
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
pingProcess = new QProcess(this);
pingProcess->setProcessChannelMode(QProcess::MergedChannels);
connect(pingProcess,SIGNAL(readyRead()),this,SLOT(read_dataPing())); //read_data
connect(pingProcess,SIGNAL(readyReadStandardOutput()),this,SLOT(read_dataPing())); //readyReadStandardOutput connect(pingProcess,SIGNAL(errorOccurred(QProcess::ProcessError)),this,SLOT(error_processPing())); //errorOccurred connect(pingProcess,SIGNAL(finished(int)),this,SLOT(finished_processPing())); //finished}
MainWindow::~MainWindow()
{ delete ui;
}
void MainWindow::on_PushButton_Con_clicked()
{
QString cmdPing = “ping -i 1 baidu.com”;
writePing(cmdPing);
}
void MainWindow::writePing(QString cmd)
{
pingProcess->start(cmd);
// start是一体式的:外部程序启动后,将随主程序的退出而退出;
// startDetached是分离式的:外部程序启动后,不会随主程序的退出而退出。
// 重要区别:如果是start则回调都可以正常接收到信息;如果是startDetached则回调无法正常接收到信息。
// 外部程序:返回数据
// 一句话即可。
// 要用这个:
// std::cout<<“it’s from cout”<<std::endl;
// 不要用这个:
// printf(“hello it is ok!”);
}
void MainWindow::read_dataPing()
{
QByteArray bytes = pingProcess->readAll();
if (bytes.isEmpty()) {
return;
}
QString str = QString::fromLocal8Bit(bytes);
ui->textEdit->append(str);
}
//进程错误信息
void MainWindow::error_processPing()
{
int err_code = pingProcess->exitCode();
QString err = pingProcess->errorString();
ui->statusbar->showMessage(QString(“ping error code:%1”).arg(err_code));
qDebug()<<“pingProcess err_code:”<<err_code;
}
//Exit
void MainWindow::finished_processPing()
{
int exit_code = pingProcess->exitCode();
ui->statusbar->showMessage(QString(“ping exit code:%1”).arg(exit_code));
qDebug()<<“pingProcess exit_code:”<<exit_code;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值