// main.cpp
#include <QtCore/QCoreApplication>
#include "commander.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
commander cmd;
cmd.action(QByteArray("pwd"));
cmd.action(QByteArray("ls -l"));
return a.exec();
}
// commander.h
#pragma once
#include <QObject>
#include <qdebug.h>
#include <qprocess.h>
class commander : public QObject
{
Q_OBJECT
public:
commander(QObject *parent);
~commander();
signals:
public slots:
void readyRead();
void action(QByteArray data);
private:
QProcess proc;
QString app;
QString endl;
};
// commander.cpp
#include "commander.h"
commander::commander(QObject *parent)
: QObject(parent)
{
#ifdef Q_OS_WIN
// Windows
app = "cmd";
endl = "\r\n";
#else
// others
app = "bash";
endl = "\n";
#endif
proc.setProgram(app);
proc.start();
proc.setReadChannelMode(QProcess::MergedChannels);
connect(&proc, &QProcess::readyRead, this, &commander::readyRead);
connect(&proc, &QProcess::readyReadStandardOutput, this, &commander::readyRead);
connect(&proc, &QProcess::readyReadStandardError, this, &commander::readyRead);
}
commander::~commander()
{
if (proc.isOpen()) {
proc.close();
}
}
void commander::action(QByteArray data)
{
if (!data.endsWith(endl.toLatin1())) data.append(endl);
proc.write(data);
proc.waitForBytesWritten(1000);
}
void commander::readyRead()
{
qint64 value = 0;
do {
QByteArray line = proc.readAll();
qInfo() << line.trimmed();
value = line.length();
} while (value > 0);
}