Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Firefox от Июнь 03, 2014, 14:57



Название: QProcess
Отправлено: Firefox от Июнь 03, 2014, 14:57
Здравствуйте. вычитала в документации, что в QProcess возможно общение через каналы. вопрос в qt 4.3.3 работает ли это в Windows 7? Мне необходимо запустить процесс my_proga.exe и программы Base.exe, и получать события нажатия кнопок из my_proga.exe в Base.exe. Но я не понимаю, если это можно сделать как-то, то как записать в my_proga.exe то, что надата кнопка 1 и это я прочитаю потом в Base.exe по сигналу readyReadStandardOutput ().
Код:
 QProcess  prc= new QProcess (parent);
 QObject::connect(prc, SIGNAL(readyReadStandardOutput ()), this, SLOT(read_prc()) );
 prc->start("my_proga.exe", QStringList() << arg1,,arg2);


Название: Re: QProcess
Отправлено: Firefox от Июнь 03, 2014, 15:50
В общем-то вопрос по сути как записать в stdout из дочернего процесса правильно.


Название: Re: QProcess
Отправлено: xokc от Июнь 04, 2014, 08:13
Ну хоть немного конкретики - первый пост был отгуглотрансечен с русского на зимбабвийский и обратно?
В дочернем процессе cout использовать запрещено?


Название: Re: QProcess
Отправлено: Firefox от Июнь 04, 2014, 09:24

Надо бало подключить iostream оказывается чтобы cout программа видела.
и почему-то
connect(prc, SIGNAL(readyReadStandardOНаutput ()), this, SLOT(read_prc()) );  возвращает false


Название: Re: QProcess
Отправлено: Old от Июнь 04, 2014, 09:47
программа ругается что не знает что такое cout, работаю в VS2003.
Это потому, что cout определен в iostream.

и почему-то
connect(prc, SIGNAL(readyReadStandardOutput ()), this, SLOT(read_prc()) );  возвращает false
А read_prc определен в секции slots?


Название: Re: QProcess
Отправлено: Firefox от Июнь 04, 2014, 09:54
Да это private slots,в консоли выводит следующее attempt to bind non-signal QProcess::readyReadStandardOutput()


Название: Re: QProcess
Отправлено: Firefox от Июнь 04, 2014, 11:33
Проблема была с qobject но все хорошо, только пока что сигнал не генерится.


Название: Re: QProcess
Отправлено: kambala от Июнь 04, 2014, 12:39
а my_proga.exe запускается вообще? может ее нет в папке с экзешником?


Название: Re: QProcess
Отправлено: Firefox от Июнь 04, 2014, 13:03
Запескается. В конструкторе у нее стоит
Код:
Std::cout<<"hello world";



Название: Re: QProcess
Отправлено: Bepec от Июнь 04, 2014, 13:11
Когда подобное делал, QProcess не генерил сигнал, пока не приходил символ конца строки :D
Попробуйте, вдруг поможет :)


Название: Re: QProcess
Отправлено: Firefox от Июнь 04, 2014, 13:37
Спасибо попробую. пока выложу точный код моей программы, может там есть косяки явные
Код:
ypr::ypr(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
QStringList arg;
arg<<"rm1"<<"0"<<"ARMO"<<"98"<<"198"<<"192.168.1.29";
pr_obz=new QProcess(parent);
pr_obz->setReadChannel(QProcess::StandardOutput);
pr_obz->setReadChannelMode(QProcess::MergedChannels);

pr_obz->start("TKO.exe", arg);
pr_obz->waitForStarted();
bool bn=false;
bn=connect(pr_obz,SIGNAL(readyReadStandardOutput()),this,SLOT(Slott()));
}
void ypr::Slott()
{
QString str=pr_obz->readAllStandardOutput();
ui.lineEdit->setText(str);
}
В программе TKO.exe
Код:
#include <iostream>
using namespace std;
TKO::TKO(QWidget *parent,Qt::WindowFlags flags, int argc,char *argv[]) :
    QWidget(parent,flags),
    ui(new Ui::TKO)
{
    ui->setupUi(this);
std::cout<<"hello"; \\ добавлю конец строки
}


Название: Re: QProcess
Отправлено: Firefox от Июнь 04, 2014, 14:01
\n не помог, подскажите что у меня может быть не так в коде


Название: Re: QProcess
Отправлено: kambala от Июнь 04, 2014, 14:48
попробуй коннект делать перед pr_obz->start("TKO.exe", arg);

Q_OBJECT написан?


Название: Re: QProcess
Отправлено: Firefox от Июнь 04, 2014, 15:26
Пробовала ставить перед запуском не помогло. Q_Object есть, connect возвращает true. Если зактыть TKO.exe воучную, то тогда возникает сигнал и я захожу в слот. Но мне надо во время рботы программы отсылать данные , а не после завершения.


Название: Re: QProcess
Отправлено: Old от Июнь 04, 2014, 15:54
Если зактыть TKO.exe воучную, то тогда возникает сигнал и я захожу в слот. Но мне надо во время рботы программы отсылать данные , а не после завершения.
cout буферизируется. Сбрасывайте буфер, либо через его метод flush, либо добавьте в конец std::endl (endl сам вызовет flush).


Название: Re: QProcess
Отправлено: Kurles от Июнь 04, 2014, 15:55
\n не помог, подскажите что у меня может быть не так в коде
Вместо "\n" использовать std::flush


Название: Re: QProcess
Отправлено: Bepec от Июнь 04, 2014, 15:59
Эмм... да, наверно меня не так понял ТС - именно std::endl необходимо использовать :)


Название: Re: QProcess
Отправлено: Firefox от Июнь 05, 2014, 09:42
Спасибо большое за помощь,  все хорошо работает.