使用 Qt 写入终端

Posted

技术标签:

【中文标题】使用 Qt 写入终端【英文标题】:Writing to the terminal using Qt 【发布时间】:2014-07-02 11:47:23 【问题描述】:

我需要通过 Qt 向终端提供输入来执行终端命令。我也想阅读输出。我找到了一种适用于 Windows 的解决方案 (QProcess problems, output of process)。代码如下:

#include <QtCore/QCoreApplication>
#include <QTextStream>
#include <QByteArray>
#include <QString>
#include <QProcess>

int main(int argc, char *argv[])

    QCoreApplication a(argc, argv);
    QTextStream qout(stdout);
    QByteArray result;
    QProcess cmd2;

    cmd2.setReadChannel(QProcess::StandardOutput);
    cmd2.setProcessChannelMode(QProcess::MergedChannels);
    cmd2.start("cmd");
    if (!cmd2.waitForStarted())
        qout << "Error: Could not start!" << endl;
        return 0;
    
    cmd2.write("ipconfig\n");
    cmd2.closeWriteChannel();   //done Writing

    while(cmd2.state()!=QProcess::NotRunning)
        cmd2.waitForReadyRead();
        result = cmd2.readAll();
        qout << result;
    
    qout << endl << "---end----" << endl;
    return a.exec();

在 ubuntu 中,我将“cmd”更改为“xterm”,将“ipconfig”更改为“ifconfig”,但它不起作用!

【问题讨论】:

its not working 不工作。请解释实际输出是什么。另外,为什么您没有使用正确的 Qt 类获取网络数据? 没有输出。当我关闭 xterm 窗口时,它只会在控制台应用程序中打印“---end----”。 目的不是获取网络数据。我正在尝试通过的标准输入来执行 shell 命令。 ifconfig 只是一个例子 好吧,您需要解释用例以获得最佳建议。打开终端可能是红鲱鱼,但它可能是有效的。这需要澄清。目前尚不清楚您要达到什么目标,至少对我来说是这样。 我对 C# 应用程序不是特别感兴趣。我对用例是什么更感兴趣。潜在地,放弃这个概念可能会更好地移植。不要告诉我们它在做什么,而是告诉我们它试图实现什么。您需要了解它试图实现的目标才能正确移植它。 【参考方案1】:

好的,我找到了解决方案。使用 bash 而不是 xterm。我真的不确定为什么会这样。我的猜测是,当我使用 xterm 时,它打开了一个单独的窗口,并且 xterm 进程与主进程分离。但在 bash 中,它在与 qt 控制台应用程序相同的终端中执行所有操作。

【讨论】:

xterm 不接受标准输入的输入,而是将输入作为 X11 事件。我真的不明白你为什么要运行一个shell。您可以直接运行ipconfig,而无需运行任何类型的shell

以上是关于使用 Qt 写入终端的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt 5 中写入和读取 QResource 文件?

qt中如何模拟shell里的echo命令?

Qt:QProcess调用终端+脚本

在 Qt 中使用 setText 将端口名写入标签

ImageMagick 使用 qt ans magick++ 打开并写入图像

找不到带有 CATALINA 的 qt 或 x11 终端 gnuplot