Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Kurles от Июнь 24, 2012, 19:33



Название: [Решено]Помогите разобраться с QProcess
Отправлено: Kurles от Июнь 24, 2012, 19:33
Здравствуйте!

Пытаюсь заставить 2 приложения взаимодействовать через QProcess, но никак не получается передать данные в запускаемую программу.

В основной программе запускаю "дочернюю" так:

Код
C++ (Qt)
   connect(&process, SIGNAL(readyReadStandardOutput()), this, SLOT(onReadyRead()));
   process.start("Child");
   if (!process.waitForStarted())
   {
       qDebug() << "failed to start child program";
       QTimer::singleShot(0, qApp, SLOT(quit()));
   }
В слоте onReadyRead:

Код
C++ (Qt)
void MainWindow::onReadyRead()
{
   qDebug() << "onReadyRead";
   qDebug() << process.readAllStandardOutput();
}
Здесь все хорошо, сообщения от stdout дочерней программы приходят.  

код запускаемой программы:

Код
C++ (Qt)
MainClass::MainClass(QObject *parent) :
   QObject(parent),
   qStdin(stdin), //qStdin и qStdout - QTextStream
   qStdout(stdout)
{
   QFile *debug = new QFile("debug_output");
   debug->open(QIODevice::WriteOnly);
   debugOut.setDevice(debug);
   debugOut << "in MainClass constructor" << endl;
   connect(qStdin.device(), SIGNAL(readyRead()), this, SLOT(onReadyRead()));
   qStdout << "hello from QProcess!";
   qStdout.flush();
}
 
void MainClass::onReadyRead()
{
   debugOut << "inReadyRead" << endl;
   debugOut << qStdin.readAll() << endl;
   debugOut.flush();
}
Дак вот, при вызове process.write() из основной программы сигнал readyRead дочерней не испускается. Что я делаю не так?

минимально компилируемый проект в аттаче.


Название: Re: Помогите разобраться с QProcess
Отправлено: Bepec от Июнь 24, 2012, 19:37
Не увидел у вас в коде вызова process.write. :/

Поиск тоже его в вашем коде не нашёл, не?


Название: Re: Помогите разобраться с QProcess
Отправлено: Kurles от Июнь 24, 2012, 19:41
Не увидел у вас в коде вызова process.write. :/

Поиск тоже его в вашем коде не нашёл, не?
Вроде есть:
Код
C++ (Qt)
void MainWindow::on_pushButtonShow_clicked()
{
   process.write("hello/n");
}


Название: Re: Помогите разобраться с QProcess
Отправлено: Bepec от Июнь 24, 2012, 19:44
Кхм. Я очень извиняюсь, но лично мне нехватает кода. H-ников, cpp-шников.
Куски это хорошо, только тогда когда по ним нет вопросов :)

Прошу выложить код в стиле h-cpp классов.


Название: Re: Помогите разобраться с QProcess
Отправлено: Kurles от Июнь 24, 2012, 19:51
В аттаче же проект компилируемый, как основой, так и дочерней программы, с .h, .cpp и даже .pro файлами :)


Название: Re: Помогите разобраться с QProcess
Отправлено: Bepec от Июнь 24, 2012, 21:07
Проше прощения, не обратил внимания :)

update: Слот вызывается, выводит надпись Hello Qt. Код не изменял.
ЧЯДНТ?


Название: Re: Помогите разобраться с QProcess
Отправлено: Kurles от Июнь 24, 2012, 21:31
Проше прощения, не обратил внимания :)

update: Слот вызывается, выводит надпись Hello Qt. Код не изменял.
ЧЯДНТ?
В основной программе вызывается, я это писал, а в запускаемой - нет. То бишь сообщения от QProcess я могу получать, а в него передавать не получается.


Название: Re: Помогите разобраться с QProcess
Отправлено: Bepec от Июнь 24, 2012, 22:46
То есть ты хочешь передавать программе дочке данные, чтобы она их обрабатывала?

Хм. Помоему никак. Даже если в цикле std считывать, ентер то не нажмётся.

Ммм... посмотрю завтра, мб ещё что нить скажу )


Название: Re: Помогите разобраться с QProcess
Отправлено: Kurles от Июнь 25, 2012, 00:09
То есть ты хочешь передавать программе дочке данные, чтобы она их обрабатывала?

Хм. Помоему никак. Даже если в цикле std считывать, ентер то не нажмётся.

Ммм... посмотрю завтра, мб ещё что нить скажу )

Да, именно это и хочу.


Название: Re: Помогите разобраться с QProcess
Отправлено: Kurles от Июнь 25, 2012, 00:19
То есть ты хочешь передавать программе дочке данные, чтобы она их обрабатывала?

Хм. Помоему никак. Даже если в цикле std считывать, ентер то не нажмётся.

Ммм... посмотрю завтра, мб ещё что нить скажу )

Победил таки. В отдельном потоке в цикле читает из stdin, и емитит результат в основной поток. Да, интер нажимается через "\n" :)

Код
C++ (Qt)
void ReadStdioThread::startReading()
{
   QTextStream ts(stdin);
   while(true)
   {
       QString str;
       ts >> str;
       emit lineReceived(str);
       QApplication::processEvents();
       if (str == "quit")
           break;
   }
}


Название: Re: Помогите разобраться с QProcess
Отправлено: Bepec от Июнь 25, 2012, 06:48
Вот и молодец :) Да и мне наука будет ;)