For what it's worth, in an ongoing project in use:
#include <QtWidgets>
#include <iostream>
#include <sstream>
#include <apl/libapl.h>
#include "aplexec.h"
LIBAPL_error
AplExec::aplExec (apl_op_e apl_op, QString &cmd,
QString &outString, QString &errString)
{
LIBAPL_error execerr = LAE_NO_ERROR;
switch(apl_op) {
case APL_OP_EXEC:
{
std::stringstream outbuffer;
std::streambuf *coutbuf = std::cout.rdbuf();
std::cout.rdbuf(outbuffer.rdbuf());
std::stringstream errbuffer;
std::streambuf *cerrbuf = std::cerr.rdbuf();
std::cerr.rdbuf(errbuffer.rdbuf());
execerr = apl_exec (cmd.toStdString ().c_str ());
std::cout.rdbuf(coutbuf);
std::cerr.rdbuf(cerrbuf);
outString = QString (outbuffer.str ().c_str ());
errString = QString (errbuffer.str ().c_str ());
}
break;
case APL_OP_COMMAND:
{
std::stringstream errbuffer;
std::streambuf *cerrbuf = std::cerr.rdbuf();
std::cerr.rdbuf(errbuffer.rdbuf());
const char *res = apl_command (cmd.toStdString ().c_str ());
if (res) {
outString = QString (res);
free ((void *)res);
}
std::cerr.rdbuf(cerrbuf);
errString = QString (errbuffer.str ().c_str ());
}
break;
}
return execerr;
}
I.e., I'm capturing stdout and stderr in strings.