Версия qt - 4.4.3.
Новичок в qt
Проблема в следующем: есть программа, которой надо послать в стандартный поток ввода данные и получить ответ через стандартный поток вывод
Для записи в поток использовал метод write - программа ничего не получает.
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
~Dialog();
private:
Ui::Dialog *ui;
QProcess proc;
private slots:
void on_pbSendText_clicked();
void on_pbStopProcess_clicked();
void on_pbStartProcess_clicked();
void showStdOut();
void showErrOut();
void processStoped(int _exitCode);
void timerTime();
};
QString prog = "/usr/test_console/test_console";
Dialog::Dialog(QWidget *parent)
: QDialog(parent), ui(new Ui::Dialog)
{
ui->setupUi(this);
connect(&proc, SIGNAL(readyReadStandardOutput()), this, SLOT(showStdOut()));
connect(&proc, SIGNAL(readyReadStandardError()), this, SLOT(showErrOut()));
connect(&proc, SIGNAL(finished(int)), this, SLOT(processStoped(int)));
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(timerTime()));
timer->start();
}
Dialog::~Dialog()
{
delete ui;
proc.terminate();
}
void Dialog::on_pbStartProcess_clicked()
{
QStringList arg;
proc.setProcessChannelMode(QProcess::MergedChannels);
proc.start(prog, arg, QIODevice::ReadWrite | QIODevice::Unbuffered);
if(proc.waitForStarted())
{
ui->pteStdOut->appendPlainText(QString("рТПГЕУУ: %1 ЪБРХЭЕО").arg(prog));
ui->pteStdOut->appendPlainText(proc.readAllStandardOutput());
ui->pbStartProcess->setEnabled(false);
ui->pbStopProcess->setEnabled(true);
}
else
{
ui->pteStdOut->appendPlainText(QString("оЕ ЪБРХУЛБЕФУС РТПГЕУУ: %1").arg(prog));
ui->pbStartProcess->setEnabled(true);
ui->pbStopProcess->setEnabled(false);
}
}
void Dialog::on_pbStopProcess_clicked()
{
if(proc.state() == QProcess::Running)
{
proc.terminate();
ui->pteStdOut->appendPlainText(QString("рТПГЕУУ: %1 ПУФБОПЧМЕО").arg(prog));
ui->pbStartProcess->setEnabled(true);
ui->pbStopProcess->setEnabled(false);
}
}
void Dialog::on_pbSendText_clicked()
{
QByteArray data = Convert::StringToBytes(ui->leSendText->text());
proc.write(data);
}
void Dialog::showStdOut()
{
ui->pteStdOut->appendPlainText(Convert::BytesToString(proc.readAllStandardOutput()));
}
void Dialog::showErrOut()
{
ui->pteErrOut->appendPlainText(QString::fromLocal8Bit(proc.readAllStandardError()));
}
void Dialog::processStoped(int _exitCode)
{
ui->pbStartProcess->setEnabled(true);
ui->pbStopProcess->setEnabled(false);
}
void Dialog::timerTime()
{
}
YGit::YGit(QObject* p_parent)
:QObject(p_parent)
,out(stdout)
,error(stderr)
{
process = new QProcess(this);
outCodec = QTextCodec::codecForName("IBM866");
out.setCodec(outCodec);
error.setCodec(outCodec);
}
//...
bool YGit::checkout(QString name)
{
QString outString;
name = QDir::fromNativeSeparators(name);
QString cmd = QString("%1\\git checkout %2").arg(m_gitPath).arg(name);
/* out << "Creat Process:" << cmd;
out.flush();*/
cmd = cmd.toUtf8();
process->setProcessChannelMode(QProcess::MergedChannels);
process->start(cmd);
if (!process->waitForStarted()){
error << " - may not started" << endl << flush;
return false;
}
QTime t;
t.start();
int sec = 1000; // 1000 ms
int min = 60* sec; // 60 s
int maxtime = 3*min;
while(1){
if (process->waitForReadyRead(maxtime)){
outString += QString::fromUtf8(process->readAllStandardOutput().data());
t.restart();
}
if (process->state() != QProcess::Running){
if (process->exitCode() == 0){
return true;
}else{
out << outString << flush;
qDebug() << "Process" << cmd << "finished with error";
return false;
}
}
if (t.elapsed() >= maxtime){
error << " - may not finished" << endl << flush;
return false;
}
}
}