如何在Qt Creator中通过QProcess获取外部C++程序的c、d变量值
从外部C++程序获取变量值到Qt程序的实现方法
核心逻辑:你的外部test程序已经通过cout将c、d的值输出到标准输出流,Qt端通过QProcess的readyReadStandardOutput信号已经可以捕获所有输出内容,仅需要对输出内容做解析即可提取到对应变量值,作为Qt程序的输入使用。
步骤1:优化外部程序输出格式(可选但推荐)
如果可以修改test程序的源码,建议新增结构化输出内容,降低Qt端解析难度,修改后的main.cpp示例如下:
#include <iostream> #include "ZFraction.h" using namespace std; int main() { ZFraction a(4,5); ZFraction b(2); ZFraction c,d; c = a+b; d = a*b; // 原有打印可以保留 cout << a << " + " << b << " = " << c << endl; cout << a << " * " << b << " = " << d << endl; // 新增结构化输出,用固定前缀标识变量 cout << "qt_parse_c:" << c << endl; cout << "qt_parse_d:" << d << endl; return 0; }
如果无法修改外部test程序源码,直接解析原有输出内容也可以实现。
步骤2:Qt端修改槽函数解析输出内容
修改你现有代码中的readyReadStandardOutput槽函数,拆分提取c、d的值:
void Mafenetre::readyReadStandardOutput(){ // 读取所有标准输出内容 QByteArray rawOutput = myprocess->readAllStandardOutput(); QString outputStr = QString::fromLocal8Bit(rawOutput); // 按行拆分输出内容 QStringList lineList = outputStr.split('\n', Qt::SkipEmptyParts); QString cValue, dValue; for(const QString& line : lineList) { // 适配结构化输出的解析逻辑 if(line.startsWith("qt_parse_c:")) { cValue = line.mid(QString("qt_parse_c:").length()).trimmed(); qDebug() << "提取到c的值:" << cValue; } else if(line.startsWith("qt_parse_d:")) { dValue = line.mid(QString("qt_parse_d:").length()).trimmed(); qDebug() << "提取到d的值:" << dValue; } // 适配原有输出的解析逻辑(没改test程序时用这部分) else if(line.contains("+") && line.contains("=")) { cValue = line.split('=').last().trimmed(); } else if(line.contains("*") && line.contains("=")) { dValue = line.split('=').last().trimmed(); } } // 拿到值后可直接作为Qt程序的输入使用,比如更新UI、传入图表绘制模块、存入成员变量等 // 示例:显示到界面标签 // ui->c_result_label->setText(cValue); // ui->d_result_label->setText(dValue); }
注意事项
- 你当前代码里写的
./test是相对路径,建议替换为test程序的绝对路径,或者将test可执行文件放到Qt程序的运行工作目录下,避免QProcess启动失败。可以加启动校验逻辑:myprocess->start(program); if(!myprocess->waitForStarted()) { qDebug() << "test程序启动失败:" << myprocess->errorString(); } - 如果你需要在Qt端直接操作
ZFraction类型的对象,把ZFraction的头文件和实现文件引入Qt项目即可,解析到字符串值后可以直接转为ZFraction实例。 - 如果
test程序不需要传参,你现有代码里的arguments << " "可以删掉,直接调用myprocess->start(program)即可,多余的空参数可能导致程序运行异常。
内容的提问来源于stack exchange,提问作者Thib
相关产品推荐
相关产品推荐

