使用 QProcess 为 c++ 控制台应用程序实现前端
Posted
技术标签:
【中文标题】使用 QProcess 为 c++ 控制台应用程序实现前端【英文标题】:Implementing a frontend for a c++ console application using QProcess 【发布时间】:2016-09-15 18:15:33 【问题描述】:我正在尝试使用 Qt 为简单的 C++ 实现 GUI,以了解它是如何工作的。 C++ 程序和 GUI 在 VS 2015 中的同一解决方案中位于不同的项目中。Qt 程序将使用 QProcess 的 start() 函数调用 C++ 程序。 C++ 控制台应用程序将在后台运行,Qt 程序将充当接口。我的问题是,如何使用 QProcess 将值传递给 C++ 程序以及如何从 C++ 程序中获取输出?这是我正在使用的示例程序:-
C++ 程序
#include<iostream>
#include<fstream>
using namespace std;
void main()
int a;
cout << "Enter a number" << endl;
cin >> a;
cout << "The Square of the number is " << (a*a) << endl;
ofstream write;
write.open("test.txt");
write << (a * a);
write.close();
Qt 程序
#include "FrontEnd.h"
#include <QtWidgets/QApplication>
#include <qprocess.h>
int main(int argc, char *argv[])
QApplication a(argc, argv);
FrontEnd w;
w.show();
QProcess p1;
p1.start("Interface.exe");
p1.write("5",5);
return a.exec();
我尝试使用 write() 函数传递值,但它似乎不起作用,因为 test.txt 文件仍然为空。我编写的 Qt 程序缺少 GUI 功能,因为一旦我弄清楚如何使用 QProcess 发送和接收数据,我将添加它们。感谢您的帮助!
【问题讨论】:
很简单!一旦进程启动(等待它的started()
信号或QProcess::waitForStarted()
),通过进程的write
方法写入它的stdin
。然后 C++ 进程通过其cin
命令获取数据并返回结果(为简单起见,不要将结果写入文件,而是在stdout
上返回),因此在Qt 应用程序中您可以读取stdout
.
【参考方案1】:
你显示的代码有很多问题:
您正在传递write
两个参数"5"
和5
,这意味着它将使用来自char*
"5"
的5 个char
s。当然,这不是您想要的,因为这将导致访问不属于您的数据的内存导致未定义的行为。
相反,您应该使用second version of write
,它接受一个以零结尾的字符串,如下所示:p1.write("5");
为了让你的控制台程序中的cin
知道它应该读取的号码已经完成,你应该在你的号码后面换一个新行,这样你的电话就会结束像这样:p1.write("5\n");
您应该在 Qt 程序中使用readyRead
信号来收到通知,当您的进程有可以读取的新输出时,您可以从插槽调用readAll
连接到那个信号。
为了完整起见,您的代码应该是这样的:
interface.cpp
#include<iostream>
using namespace std;
void main()
int a;
cin >> a;
//No need to use file output
//it is simpler and more appropriate to read the output from stdout
cout << "The Square of the number is " << (a*a) << endl;
Qt 程序
#include <QApplication>
#include <QWidget>
#include <QProcess>
#include <QDebug>
#include "FrontEnd.h"
int main(int argc, char *argv[])
QApplication a(argc, argv);
FrontEnd w;
w.show();
QProcess p1;
p1.start("Interface.exe");
p1.write("5\n");
QObject::connect(&p1, &QProcess::readyRead, [&p1]()
//output to qDebug, you may want to update some GUI component instead
qDebug() << p1.readAll();
);
return a.exec();
【讨论】:
以上是关于使用 QProcess 为 c++ 控制台应用程序实现前端的主要内容,如果未能解决你的问题,请参考以下文章