Russian Qt Forum
Сентябрь 30, 2024, 22:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено]Помогите разобраться с QProcess  (Прочитано 5275 раз)
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« : Июнь 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 дочерней не испускается. Что я делаю не так?

минимально компилируемый проект в аттаче.
« Последнее редактирование: Июнь 25, 2012, 08:16 от Kurles » Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Bepec
Гость
« Ответ #1 : Июнь 24, 2012, 19:37 »

Не увидел у вас в коде вызова process.write. :/

Поиск тоже его в вашем коде не нашёл, не?
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #2 : Июнь 24, 2012, 19:41 »

Не увидел у вас в коде вызова process.write. :/

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

Код
C++ (Qt)
while(!asleep()) sheep++;
Bepec
Гость
« Ответ #3 : Июнь 24, 2012, 19:44 »

Кхм. Я очень извиняюсь, но лично мне нехватает кода. H-ников, cpp-шников.
Куски это хорошо, только тогда когда по ним нет вопросов Улыбающийся

Прошу выложить код в стиле h-cpp классов.
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #4 : Июнь 24, 2012, 19:51 »

В аттаче же проект компилируемый, как основой, так и дочерней программы, с .h, .cpp и даже .pro файлами Улыбающийся
« Последнее редактирование: Июнь 24, 2012, 19:53 от Kurles » Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Bepec
Гость
« Ответ #5 : Июнь 24, 2012, 21:07 »

Проше прощения, не обратил внимания Улыбающийся

update: Слот вызывается, выводит надпись Hello Qt. Код не изменял.
ЧЯДНТ?
« Последнее редактирование: Июнь 24, 2012, 21:15 от Bepec » Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #6 : Июнь 24, 2012, 21:31 »

Проше прощения, не обратил внимания Улыбающийся

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

Код
C++ (Qt)
while(!asleep()) sheep++;
Bepec
Гость
« Ответ #7 : Июнь 24, 2012, 22:46 »

То есть ты хочешь передавать программе дочке данные, чтобы она их обрабатывала?

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

Ммм... посмотрю завтра, мб ещё что нить скажу )
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #8 : Июнь 25, 2012, 00:09 »

То есть ты хочешь передавать программе дочке данные, чтобы она их обрабатывала?

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

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

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

Код
C++ (Qt)
while(!asleep()) sheep++;
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #9 : Июнь 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;
   }
}
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Bepec
Гость
« Ответ #10 : Июнь 25, 2012, 06:48 »

Вот и молодец Улыбающийся Да и мне наука будет Подмигивающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.211 секунд. Запросов: 23.