C++ 如何向GUI应用程序插入命令行

C++ 如何向GUI应用程序插入命令行,c++,qt,qtgui,qprocess,qplaintextedit,C++,Qt,Qtgui,Qprocess,Qplaintextedit,我需要制作一个能够运行命令行批处理和命令的QtGUI应用程序。例如,ping、tcpdump等 我会这样想: 带有QTableView、一些复选框等的标准图形窗口。。。使用组件实例QPlainTextEdit。该组件(QPlainTextEdit)将充当命令行,允许输入命令并捕获其输出 这可能吗?应该如何做到这一点?您可以根据自己的需要使用QProcess QProcess cmd; cmd.start("cmd"); 这里有更多的细节 主要思想是使用QProcess运行命令。请参见下面的代码

我需要制作一个能够运行命令行批处理和命令的QtGUI应用程序。例如,ping、tcpdump等

我会这样想: 带有QTableView、一些复选框等的标准图形窗口。。。使用组件实例QPlainTextEdit。该组件(QPlainTextEdit)将充当命令行,允许输入命令并捕获其输出


这可能吗?应该如何做到这一点?

您可以根据自己的需要使用QProcess

QProcess cmd;
cmd.start("cmd");
这里有更多的细节


主要思想是使用
QProcess
运行命令。请参见下面的代码进行演示

同步方法
免责声明:这是完全未经测试的代码,因此可能存在编译器和运行时问题,但这应该可以让您轻松地掌握它。

您正在头脑中掷骰子-让他们冷静下来!你什么意思?:-)对于我在研究中为处理LungCT案例而编写的应用程序,我使用命令行生成了一个QProcess,其中的参数是从生成命令行的QDialog中的几个选项在QStringList中生成的。谢谢,它看起来很有用。我还没有解决异步操作,比如网络使用中的密码要求、ssh等。。但我希望这不会是一个问题。谢谢你的代码。从/在文本框中捕获输出和发送输入必须是同步操作。一定是在另一个线程中。如果您使用任何需要用户交互的命令或批处理,例如“是/否选择”。@exo:我也提供了一种异步方法。对不起。我是这个论坛的新手,我不知道所有的细节。但我需要的只是帮助,还有什么方向。第一个答案是可以的。我没想到会有人提供完整的代码。我必须自己去做。@exo:人们通常会接受最好的答案,而不是最快的选择礼仪:我并不是说我的答案更好,但我想我会指出这个链接,以防万一,因为你似乎是这个网站的新手(尽管我也是)
QProcess process;

// If "command" is not in your path,
// use the corresponding relative or absolute path

process.start("command", QStringList()
                      << QString("-arg1")
                      << QString("arg2")
                      << QString("-arg3")
                      << QString("arg4"));

// Wait for it to start
if(!process.waitForStarted())
    return 0;

bool retval = false;
QByteArray buffer;
while ((retval = process.waitForFinished()));
    buffer.append(process.readAll());

if (!retval) {
    yourPlainTextEdit.appendPlainText(process.errorString());
} else {
    yourPlainTextEdit.appendPlainText(buffer);
}
MyClass::MyClass(QQProcess *process, QObject *parent)
    : QObject(parent)
    , m_process(process)
{
    connect(m_process, SIGNAL(readyRead()), SLOT(handleReadyRead()));
    connect(m_process, SIGNAL(error(QProcess::ProcessError)), SLOT(handleError(QProcess::ProcessError)));
    connect(&m_timer, SIGNAL(timeout()), SLOT(handleTimeout()));

    m_timer.start(5000);
}

MyClass::~MyClass()
{
}

void MyClass::handleReadyRead()
{
    m_readData.append(m_process->readAll());

    if (!m_timer.isActive())
        m_timer.start(5000);
}

void MyClass::handleTimeout()
{
    if (m_readData.isEmpty()) {
        yourPlainTextEdit.appendPlainText("No data was currently available for reading from gnuplot");
    } else {
        yourPlainTextEdit.appendPlainText("Process successfully run");
    }

}

void GnuPlotReader::handleError(QProcess::ProcessError processError)
{
    if (processError == QProcess::ReadError) {
        appendPlainTextEdit.appendPlainText("An I/O error occurred while reading the data, error: %1").arg(m_process->errorString()));
        yourPlainTextEdit.appendPlainText(m_readData);
    }
}