Regarding QProcess:: Not able to read data from the console
-
Hi all
I am using QProcess in my application to start another process which prints some information in the console using qDebug, but i am not able to read the printed data from the console. I tried with the readAllStandardOutput() method but i am getting empty string in my application output.
can anyone guide me how to do this ?
code is...
.cpp#include "ProcessWidget.h" ProcessWidget::ProcessWidget(QWidget *parent) : QWidget(parent) { m_btn= new QPushButton("click here",this); connect(m_btn,SIGNAL(clicked()),this,SLOT(vStartProcess())); } void ProcessWidget::vStartProcess() { QString program = "/home/ubuntu/Documents/Sample_Examples_Qt_Qml/VoiceRecognition/VoiceRecognition"; myProcess = new QProcess; myProcess->start(program); // myProcess->waitForFinished(30000); QString output(myProcess->readAllStandardOutput()); qDebug()<<"Output>>>>"<<output<<endl; } ProcessWidget::~ProcessWidget() { }
-
the process tells you when to read, you can't just read at will...
(you also have memory leak problems)void ProcessWidget::vStartProcess() { const QString program = QStringLiteral("/home/ubuntu/Documents/Sample_Examples_Qt_Qml/VoiceRecognition/VoiceRecognition"); QProcess* myProcess = new QProcess(this); connect(myProcess,&QProcess::readyReadStandardOutput,[myProcess]()->void{ qDebug()<<"Output: "<< myProcess->readAllStandardOutput(); }); connect(myProcess,&QProcess::finished,myProcess,&QProcess::deleteLater); myProcess->start(program); }
-
Hi,
you can usewaitForReadyRead(milliseconds)
. But usually you connect to thereadyReadStandardOutput()
signal andreadAllStandardOutput()
there, see above :-).AND you should not forget to connect to
readyReadStandardError()
as well. There you will see problems like: "VoiceRecognition: command not found".
-Michael -
@VRonin Thanks for the reply...
i tried with whatever u have shown above...it is giving me error/home/ubuntu/Documents/Sample_Examples_Qt_Qml/ProcessTest/ProcessWidget.cpp:15: error: capture of non-variable 'ProcessWidget::myProcess'
connect(myProcess,&QProcess::readyReadStandardOutput,myProcess->void{
^/home/ubuntu/Documents/Sample_Examples_Qt_Qml/ProcessTest/ProcessWidget.cpp:16: error: 'this' was not captured for this lambda function
qDebug()<<"Output: "<< myProcess->readAllStandardOutput();
^/home/ubuntu/Documents/Sample_Examples_Qt_Qml/ProcessTest/ProcessWidget.cpp:18: error: no matching function for call to 'ProcessWidget::connect(QProcess*&, <unresolved overloaded function type>, QProcess*&, void (QObject::*)())'
connect(myProcess,&QProcess::finished,myProcess,&QProcess::deleteLater);
^these are the errors which i am getting...
-
@VRonin ya its the same code
#include "ProcessWidget.h" ProcessWidget::ProcessWidget(QWidget *parent) : QWidget(parent) { m_btn= new QPushButton("click here",this); connect(m_btn,SIGNAL(clicked()),this,SLOT(vStartProcess())); } void ProcessWidget::vStartProcess() { const QString program = QStringLiteral("/home/ubuntu/Documents/Sample_Examples_Qt_Qml/VoiceRecognition/VoiceRecognition"); myProcess = new QProcess(this); connect(myProcess,&QProcess::readyReadStandardOutput,[myProcess]()->void{ qDebug()<<"Output: "<< myProcess->readAllStandardOutput(); }); connect(myProcess,&QProcess::finished,myProcess,&QProcess::deleteLater); myProcess->start(program); // myProcess->waitForFinished(3000); // QString output(myProcess->readAll()); // qDebug()<<"Output>>>>"<<output<<endl; }
for this code i am getting that errors.
-
@Naveen_D said in Regarding QProcess:: Not able to read data from the console:
ya its the same code
No, as mentioned above you are using a member of the class while you should use a local variable
now i am getting no matching function call for the second connect statement
could you post the error output?
-
@VRonin ya i came to know about the local variable.
the error is...
/home/ubuntu/Documents/Sample_Examples_Qt_Qml/ProcessTest/ProcessWidget.cpp:18: error: no matching function for call to 'ProcessWidget::connect(QProcess*&, <unresolved overloaded function type>, QProcess*&, void (QObject::*)())'
connect(myProcess,&QProcess::finished,myProcess,&QProcess::deleteLater);
^ -
-
@VRonin said in Regarding QProcess:: Not able to read data from the console:
connect(myProcess,SIGNAL(finished()),myProcess,SLOT(deleteLater()));
i used this connect statement...after this the prgm builds without any issues but i am not getting any output in the console...
-
@VRonin said in Regarding QProcess:: Not able to read data from the console:
connect(myProcess,&QProcess::readyReadStandardError,myProcess->void{
qDebug()<<"Output: "<< myProcess->readAllStandardError();
});yes...got the output
thanks. one more doubt after getting the output, when i close my application i get the following in my console..
QProcess: Destroyed while process ("/home/ubuntu/Documents/Sample_Examples_Qt_Qml/VoiceRecognition/VoiceRecognition") is still running.
is there any other way to end the process ?? -
@VRonin if there are some huge debug statements and if i want a particular debug statement out of that means...now i am getting complete debug statements in my console...i want to choose a particular statement out of that. how to do this..?
-
If what you are reading are strings then you can manipulate them the usual way, for example:
const QString processOut = QString::fromLatin1(myProcess->readAllStandardError()); const QRegularExpression regXp("MyField: (\\S+)"); const auto regXpMatch = regXp.match(processOut); if(regXpMatch.hasMatch()){ qDebug() << "Output: "<< regXpMatch.captured(1); }
-
@VRonin sorry i didn't get the the regular exp part...
the actual scenario is, i will give the input at runtime via live microphone when the other process is started by this current Qprocess...and in that started process i am storing the input in a string and displaying through qDebug. those debug statements from the started process are now copied to my console, from which i need to take a particular string and pass it through a signal. -
@Naveen_D said in Regarding QProcess:: Not able to read data from the console:
which i need to take a particular string
I don't know how you identify the particular string so I just guessed a use based off a regular expression. what I mean is that instead of passing whatever you receive to your console with
qDebug()<<"Output: "<< myProcess->readAllStandardOutput();
you can do whatever you want with the read data. For example, if you want to pass every line you receive to a signal you can use:connect(myProcess,&QProcess::readyReadStandardError,[myProcess,this]()->void{ const QByteArray readData= myProcess->readAllStandardError(); QTextStream lineReader(readData); QString tempLine; while (lineReader.readLineInto(&tempLine)) { /*emit*/ mySignal(tempLine); } });
-
@VRonin As said by you i am trying with Regular Exp,
the output at present i am getting is ...
Output: "loaded file >>>>>>> 0x1c57220 \n\n"
Output: "Recognition instance >>>>> 0x1c58660 \n\n"
Output: "\n<<< please speak >>> \n\n \n\n"
Output: "Sentence :\nchar *data>>>>>>> <s> \n\nchar *data>>>>>>> WORLD \n\nchar *data>>>>>>> </s> \n\nReceived Command: "WORLD" \n\n"from this output i want to select the part which is in bold... but when i run my program and give output through a microphone i get the above output in my console...but i am not getting the regular exp qDebug part.