Цитата(ht1515 @ 1.2.2014, 15:48)
Но все равно result выдает все. И шапку и результат выполнения команды
А никто не обещал, что waitForStarted ждет пока программа будет готова принимать данные от пользователя, да еще и проскипает вводное сообщение. Для этого нужен искин. waitForStarted ждет пока ОС прочитает экзешник, выделит всякие PID-ы и.т.п, т.е. чисто на низком уровне. А дальше сам читаешь и парсишь.
Цитата(ht1515 @ 1.2.2014, 15:48)
и даже (gdb)>
А чем "(gdb)>" отличается от другого текста? Обычная строка, только без перевода каретки.
Я накидал простой пример класса работы с gdb
#ifndef GDB_H
#define GDB_H
#include <QObject>
class QProcess;
class Gdb : public QObject
{
Q_OBJECT
public:
explicit Gdb(QObject *parent = 0);
bool run();
signals:
public slots:
private slots:
void procOutDataReady();
void procErrDataReady();
private:
QProcess *mProc;
QByteArray mStdOutBuf;
QByteArray mStdErrBuf;
bool mSkip;
};
#endif // GDB_H
#include "gdb.h"
#include <QProcess>
#include <QDebug>
#include <QInputDialog>
#include <QMessageBox>
/************************************************
************************************************/
Gdb::Gdb(QObject *parent) :
QObject(parent),
mProc(new QProcess(this))
{
}
/************************************************
************************************************/
bool Gdb::run()
{
mProc->start("gdb");
mSkip = true;
if (!mProc->waitForStarted())
return false;
connect(mProc, SIGNAL(readyReadStandardOutput()),
this, SLOT(procOutDataReady()));
connect(mProc, SIGNAL(readyReadStandardError()),
this, SLOT(procErrDataReady()));
}
/************************************************
************************************************/
void Gdb::procOutDataReady()
{
mStdOutBuf += mProc->readAllStandardOutput();
if (mStdOutBuf.endsWith("(gdb) "))
{
if (!mStdErrBuf.isEmpty())
{
QMessageBox::warning(0, tr("Warning"), QString::fromLocal8Bit(mStdErrBuf));
mStdErrBuf.clear();
}
bool ok;
QString command = QInputDialog::getText(0, tr("Command"),
QString::fromLocal8Bit(mStdOutBuf),
QLineEdit::Normal, "", &ok);
mStdOutBuf.clear();
if (!ok)
{
mProc->write("quit\n");
mProc->waitForFinished(5000);
}
else
{
command += '\n';
mProc->write(command.toLocal8Bit());
}
}
}
/************************************************
************************************************/
void Gdb::procErrDataReady()
{
mStdErrBuf += mProc->readAllStandardError();
}
Не совершай стандартной ошибки новичков, никто не гарантирует, что в момент вызова procOutDataReady, процесс успел выплюнуть весь текст, вполне возможна ситуация, процесс напечатал пол слова, и в этот момент Qt решило эти данные обработать. Т.е. readAllStandardOutput вернет на все данные, а все которые готовы на этот момент. Поэтому надо накапливать в буфере.
Я обрабатываю и STOUT и STDERR, причем немного по другому чем в моей программе. Возможно через события тебе будет удобнее.
Обрати внимание, QString хранит в юникоде, процесс выдает в локальной кодировке, обязательно преобразовывать через fromLocal8Bit и toLocal8Bit
При вводе команды, надо добавлять "\n".
Желательно завершать программу корректно, я посылаю "quit" в gdb и даю ему 5 сек. на завершение.
Я не скипаю приглашение, если надо, то можно добавить условие, и при первом вызове procOutDataReady не выводить текст.