目录
一、QProcess 简述:
QProcess 可以启动其他进程 exe 软件,那么在本进程中,可否获得其他进程 (exe) 的输出信息吗?
答案是可以的,如何做呢?我们来看一下:
二、QProcess 函数与应用
1、连接信号槽函数
QProcess myProcess;
connect(&myProcess, &QProcess::readyRead,
this, &QMyProcess::showResult);
connect(&myProcess, &QProcess::stateChanged,
this, &QMyProcess::showState);
connect(&myProcess, &QProcess::errorOccurred,
this, &QMyProcess::showError);
connect(&myProcess, SIGNAL(finished(int,QProcess::ExitStatus)),
this, SLOT(showFinished(int, QProcess::ExitStatus)));
2、启动 Process
这里的 “/c” 指定后边的命令,在 cmd 中执行,这样才可以读出 ping 后的结果。
在 cmd 执行命令时,必须要加 “/c”
start 与 startDetached 重要区别:
如果是start则回调都可以正常接收到信息;
如果是startDetached则回调无法正常接收到信息。
{
QString program = "cmd.exe";
QStringList arguments;
arguments << "/c ping baidu.com";
// start是一体式的:外部程序启动后,将随主程序的退出而退出
myProcess.start(program, arguments);
// startDetached是分离式的:外部程序启动后,不会随主程序的退出而退出
//myProcess.startDetached(program, arguments);
// start 与 startDetached 重要区别:
// 如果是start则回调都可以正常接收到信息;
// 如果是startDetached则回调无法正常接收到信息。
}
2'、调用其他 exe
myProcess.start("E:\\CodeTest\\QtTools\\x64\\Debug\\QtTools.exe");
2''、其他 exe 的输出写法:
要用 cout 不能用 print
#include <QtWidgets/QApplication>
#include <iostream>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
StackedWidget w;
w.setWindowTitle("标题");
w.show();
std::cout << "it's from cout" << std::endl;
return a.exec();
}
3、读取 其他程序的输出结果信息:
void QMyProcess::showResult()
{
QTextCodec *codec = QTextCodec::codecForLocale();
qDebug() << "showResult: " << endl << codec->toUnicode(myProcess.readAll());
}
4、其他槽函数信息:
void QMyProcess::showState(QProcess::ProcessState state)
{
qDebug() << "showState: ";
if (state == QProcess::NotRunning) {
qDebug() << "Not Running";
} else if (state == QProcess::Starting) {
qDebug() << "Starting";
} else {
qDebug() << "Running";
}
}
void QMyProcess::showError()
{
qDebug() << "showError: " << endl << myProcess.errorString();
}
void QMyProcess::showFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
qDebug() << "showFinished: " << endl << exitCode << exitStatus;
}
5、结果展示:
ping 结果展示: