使用 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 个chars。当然,这不是您想要的,因为这将导致访问不属于您的数据的内存导致未定义的行为。

    相反,您应该使用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++ 控制台应用程序实现前端的主要内容,如果未能解决你的问题,请参考以下文章

Qt QProcess

使用 QProcess 读取标准输出

在 Qt 控制台应用程序中读写 QProcess

将 Ctrl+C 事件发送到在 Windows 上使用 QProcess 启动的进程

QProcess 执行一个 c++ 文件

Qt:无法使用 QProcess 启动 Windows 控制台