Qt QProcess调用外部程序,并实时打印输出信息
- 引言
- 一、源码分析
- 1. 外部程序 - 被QProcess调用启动
- 2. QProcessDemo - 调用外部程序,并实时打印输出信息
- 二、参考链接
引言
QProcess是Qt框架中的一个类,用于处理外部进程。它提供了一种直接与操作系统的进程进行交互的方式,可以启动一个外部程序,与其进行通信,获取其输出和错误信息,以及控制其运行。
本文写了一个QProcess的试例,调用一个程序并实时获取其打印的信息.
一、源码分析
1. 外部程序 - 被QProcess调用启动
写了一个专用于打印的AlwaysOut
程序. 方便QProcess
获取 使用了多种输出方式,包括但不限于cout
、qDebug
、OutputDebugStringA
等。
- 只有
cout
和fprintf
会输出到标准流? 只有这俩的输出可被QProcess获取 qDebug
等Qt输出的函数输出的内容无法被QProcess获取…怀疑没有输出,但是双击exe会输出的小黑框里
可参考 qDebug()、printf()、fprintf(stdout)等输出接口研究:https://blog.csdn.net/qq_22300209/article/details/135628264
#include <QCoreApplication>
#include <QThread>
#include <QDebug>
#include <iostream>
#include <string>
#include "windows.h"
using namespace std;
int main()
{
for (int i=0;i<3;i++)
{
cout<<i<<": "<<endl;
qDebug()<<"qDebug";
qWarning()<<"qWarning";
fprintf(stdout,"fprintf\n");
fflush(stdout);
OutputDebugStringA("Hello, Debugger!\n");
cout<<"结束"<<endl;
qDebug()<<"结束";
Sleep(3000);
}
return 0;
}
Qt项目 run中勾选run in 终端的话,OutputDebugStringA
会输出到应用程序输出界面,其他则会输出到弹出的小黑框中. 回想起了以下问题:
Qt Debug模式下应用程序输出界面乱码【已解决】:https://blog.csdn.net/qq_38204686/article/details/137793476
“应用程序输出界面“和“终端“不一样. 如何设置应用程序输出界面的编码?找不到可以设置的地方
2. QProcessDemo - 调用外部程序,并实时打印输出信息
- 记得设定通道
setProcessChannelMode(QProcess::MergedChannels)
,但亲测使用默认值也能获取cout
的输出 - 绑定
QProcess::readyRead
实时信号,使用m_process.readAll()
获取实时数据 - 增加了
m_process.waitForStarted
判断程序是否正常启动,使用QProcess::Running
判断避免重复启动
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_process.setProcessChannelMode(QProcess::MergedChannels); // 程序输出统一合并到标准输出通道
connect(&m_process, &QProcess::readyRead, this, [&]{
QString tmp = m_process.readAll();
qDebug() << tmp;
ui->textEdit->append(tmp);
});
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
if(m_process.state() == QProcess::Running){
// m_process.kill();
// m_process.waitForFinished();
// qDebug() << "kill";
QMessageBox::warning(this,tr("Warning"),"process is running");
return;
}
m_process.start("AlwaysOut.exe");
if (!m_process.waitForStarted()) {
ui->textEdit->setText(m_process.errorString());
} else {
ui->textEdit->setText("start success!");
}
}
二、参考链接
Qt调用外部exe并同步显示输出:https://blog.csdn.net/u012348774/article/details/50480379
QT QProcess调用py文件,使用readyReadStandardOutput()无法获得信号的解决办法:https://blog.csdn.net/qq_38340516/article/details/100016557
Qt5 解决 Windows 下 QProcess 无法接收到 readyRead() 信号的问题:https://blog.csdn.net/qq_47544847/article/details/131510323
qDebug输出换行的原因:https://www.cnblogs.com/nuoforever/p/15513784.html
顺序设备 - QProcess 类(启动进程,与之交互):https://zhuanlan.zhihu.com/p/52116398
Qt-QProcess无法读取进程输出以及CreateNamedPipe failed(拒绝访问)问题解决:https://blog.csdn.net/mrbone11/article/details/125736249