Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt
  • Unsolved
Collapse
qtws26_logo

The Qt Event of the Year: Qt World Summit 2026

Save Your Spot >
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. External process from Qml
Qt 6.12 LTS is out! See what's new in the release blog

External process from Qml

Scheduled Pinned Locked Moved Unsolved General and Desktop
34 Posts 4 Posters 26.1k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • VRoninV VRonin

    Maybe I'm being silly here but since you are running what looks like the Hello Speak Example why do you start it as a separate process rather than a separate thread?

    Naveen_DN Offline
    Naveen_DN Offline
    Naveen_D
    wrote on last edited by
    #11

    @VRonin Sir i am not aware of threads...i am learning it from begining...for time being i am using separate process to get the required output.

    Naveen_D

    1 Reply Last reply
    0
    • VRoninV Offline
      VRoninV Offline
      VRonin
      wrote on last edited by
      #12

      Try having a look at https://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/

      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
      ~Napoleon Bonaparte

      On a crusade to banish setIndexWidget() from the holy land of Qt

      Naveen_DN 1 Reply Last reply
      0
      • VRoninV VRonin

        Try having a look at https://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/

        Naveen_DN Offline
        Naveen_DN Offline
        Naveen_D
        wrote on last edited by
        #13

        @VRonin thanks for the link sir..i will go through it...but can i know what i need to do with the process thing to get the required output.?

        Naveen_D

        1 Reply Last reply
        0
        • VRoninV Offline
          VRoninV Offline
          VRonin
          wrote on last edited by
          #14

          That's because you block the event loop that you need to read. Use

          void ProcessWidget::vStartProcess()
          {
              qDebug()<<"entered the function"<<endl;
              const QString program = QStringLiteral("/home/ubuntu/Documents/Sample_Examples_Qt_Qml/VoiceRecognition/VoiceRecognition");
              myProcess = new QProcess;
          QEventLoop blockLoop;
              connect(myProcess,SIGNAL(readyReadStandardError()),this,SLOT(vEndProcess()));
              connect(myProcess,SIGNAL(finished(int)),myProcess,SLOT(deleteLater()));
          connect(myProcess,SIGNAL(finished(int)),&blockLoop,SLOT(quit()));
              connect(this,&ProcessWidget::destroyed,myProcess,&QProcess::kill);
              myProcess->start(program);
              qDebug()<<"process started waiting for output"<<endl;
          blockLoop.exec();
          }
          

          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
          ~Napoleon Bonaparte

          On a crusade to banish setIndexWidget() from the holy land of Qt

          Naveen_DN 1 Reply Last reply
          0
          • VRoninV VRonin

            That's because you block the event loop that you need to read. Use

            void ProcessWidget::vStartProcess()
            {
                qDebug()<<"entered the function"<<endl;
                const QString program = QStringLiteral("/home/ubuntu/Documents/Sample_Examples_Qt_Qml/VoiceRecognition/VoiceRecognition");
                myProcess = new QProcess;
            QEventLoop blockLoop;
                connect(myProcess,SIGNAL(readyReadStandardError()),this,SLOT(vEndProcess()));
                connect(myProcess,SIGNAL(finished(int)),myProcess,SLOT(deleteLater()));
            connect(myProcess,SIGNAL(finished(int)),&blockLoop,SLOT(quit()));
                connect(this,&ProcessWidget::destroyed,myProcess,&QProcess::kill);
                myProcess->start(program);
                qDebug()<<"process started waiting for output"<<endl;
            blockLoop.exec();
            }
            
            Naveen_DN Offline
            Naveen_DN Offline
            Naveen_D
            wrote on last edited by
            #15

            @VRonin Sir if i use the EventLoop it is not returning control...it will be in continuous loop like if i give input through live microphone it will wait for next input like that

            Naveen_D

            1 Reply Last reply
            0
            • Naveen_DN Naveen_D

              @p3c0 thanks for the reply...
              yea i am doing the same now... i am using a C++ class and Qprocess to start another process....the new process gives me a string (it is a command said in live microphone) which i pass it through signal back to the qml...but what is happening is..when i call the c++ function from qml, the control doesn't wait until the function is over, it continues to print some debug statements, which i have given after that function call

              VRoninV Offline
              VRoninV Offline
              VRonin
              wrote on last edited by VRonin
              #16

              @Naveen_D said in External process from Qml:

              but what is happening is..when i call the c++ function from qml, the control doesn't wait until the function is over, it continues to print some debug statements, which i have given after that function call

              @Naveen_D said in External process from Qml:

              if i use the EventLoop it is not returning control

              I'm not sure I understand what you want to achieve. Do you want the process to act synchronously (loop until process is over) or asynchronously (return control almost immediately to the main app)?

              "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
              ~Napoleon Bonaparte

              On a crusade to banish setIndexWidget() from the holy land of Qt

              Naveen_DN 1 Reply Last reply
              0
              • VRoninV VRonin

                @Naveen_D said in External process from Qml:

                but what is happening is..when i call the c++ function from qml, the control doesn't wait until the function is over, it continues to print some debug statements, which i have given after that function call

                @Naveen_D said in External process from Qml:

                if i use the EventLoop it is not returning control

                I'm not sure I understand what you want to achieve. Do you want the process to act synchronously (loop until process is over) or asynchronously (return control almost immediately to the main app)?

                Naveen_DN Offline
                Naveen_DN Offline
                Naveen_D
                wrote on last edited by
                #17

                @VRonin the scenario is..when i call the c++ function from qml it should start the process...through which i get the output and will pass the output through a signal back to qml. till the process is not completed it should not return back to main app(i.e Qml app).
                Now i am getting the output to my console but i am not able to send it as shown in the above code.

                Naveen_D

                jsulmJ 1 Reply Last reply
                0
                • Naveen_DN Naveen_D

                  @VRonin the scenario is..when i call the c++ function from qml it should start the process...through which i get the output and will pass the output through a signal back to qml. till the process is not completed it should not return back to main app(i.e Qml app).
                  Now i am getting the output to my console but i am not able to send it as shown in the above code.

                  jsulmJ Offline
                  jsulmJ Offline
                  jsulm
                  Lifetime Qt Champion
                  wrote on last edited by
                  #18

                  @Naveen_D Why should it not return? What you are trying to do is not how Qt apps should work. You should use signals/slots: you start the process, connect signals/slots and as soon as there is input from the process you handle it in the slot.

                  https://forum.qt.io/topic/113070/qt-code-of-conduct

                  Naveen_DN 1 Reply Last reply
                  1
                  • jsulmJ jsulm

                    @Naveen_D Why should it not return? What you are trying to do is not how Qt apps should work. You should use signals/slots: you start the process, connect signals/slots and as soon as there is input from the process you handle it in the slot.

                    Naveen_DN Offline
                    Naveen_DN Offline
                    Naveen_D
                    wrote on last edited by
                    #19

                    @jsulm Sorry sir i didn't get...is the above code wrong which i have posted ? or what changes i need to do ?

                    One more doubt..how to compare a string in Qml...like in Qt we do (str=="some string")

                    Naveen_D

                    jsulmJ 1 Reply Last reply
                    0
                    • Naveen_DN Naveen_D

                      @jsulm Sorry sir i didn't get...is the above code wrong which i have posted ? or what changes i need to do ?

                      One more doubt..how to compare a string in Qml...like in Qt we do (str=="some string")

                      jsulmJ Offline
                      jsulmJ Offline
                      jsulm
                      Lifetime Qt Champion
                      wrote on last edited by
                      #20

                      @Naveen_D ProcessWidget::vStartProcess is currently blocking, why? Why not just start the process, connect signals/slots and return from ProcessWidget::vStartProcess ?

                      void ProcessWidget::vStartProcess()
                      {
                          qDebug()<<"entered the function"<<endl;
                          const QString program = QStringLiteral("/home/ubuntu/Documents/Sample_Examples_Qt_Qml/VoiceRecognition/VoiceRecognition");
                          myProcess = new QProcess;
                          connect(myProcess,SIGNAL(readyReadStandardError()),this,SLOT(vEndProcess()));
                          connect(myProcess,SIGNAL(readyReadStandardOutput()),this,SLOT(processStandardOutput()));
                          connect(myProcess,SIGNAL(finished(int)),myProcess,SLOT(deleteLater()));
                          connect(this,&ProcessWidget::destroyed,myProcess,&QProcess::kill);
                          myProcess->start(program);
                      }
                      

                      processStandardOutput() will be called as soon as the process is writing something to standard output.

                      https://forum.qt.io/topic/113070/qt-code-of-conduct

                      Naveen_DN 1 Reply Last reply
                      2
                      • jsulmJ jsulm

                        @Naveen_D ProcessWidget::vStartProcess is currently blocking, why? Why not just start the process, connect signals/slots and return from ProcessWidget::vStartProcess ?

                        void ProcessWidget::vStartProcess()
                        {
                            qDebug()<<"entered the function"<<endl;
                            const QString program = QStringLiteral("/home/ubuntu/Documents/Sample_Examples_Qt_Qml/VoiceRecognition/VoiceRecognition");
                            myProcess = new QProcess;
                            connect(myProcess,SIGNAL(readyReadStandardError()),this,SLOT(vEndProcess()));
                            connect(myProcess,SIGNAL(readyReadStandardOutput()),this,SLOT(processStandardOutput()));
                            connect(myProcess,SIGNAL(finished(int)),myProcess,SLOT(deleteLater()));
                            connect(this,&ProcessWidget::destroyed,myProcess,&QProcess::kill);
                            myProcess->start(program);
                        }
                        

                        processStandardOutput() will be called as soon as the process is writing something to standard output.

                        Naveen_DN Offline
                        Naveen_DN Offline
                        Naveen_D
                        wrote on last edited by
                        #21

                        @jsulm Yes i got that...
                        i want to know how to compare string s in Qml...
                        the string which i am passing through the signal...i want to compare that in qml and next give functionality for that...

                        i used the following code but didn't get...

                        onPlaymusicsignal: {
                                            console.log("Recorded Voice :" + recordedString)
                                            var receivedString = recordedString
                                            console.log(receivedString)
                                            if(receivedString == "GOTO MUSIC")
                                            {
                                                console.log("play music")
                                            }
                                            else
                                            {
                                                console.log("please try again")
                                            }
                                        }
                        

                        even though the received string is GOTO MUSIC its printing in the console as please try again.

                        Naveen_D

                        jsulmJ 1 Reply Last reply
                        0
                        • VRoninV Offline
                          VRoninV Offline
                          VRonin
                          wrote on last edited by
                          #22

                          https://forum.qt.io/topic/10210/solved-qml-strcmp-in-qml

                          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                          ~Napoleon Bonaparte

                          On a crusade to banish setIndexWidget() from the holy land of Qt

                          1 Reply Last reply
                          0
                          • Naveen_DN Naveen_D

                            @jsulm Yes i got that...
                            i want to know how to compare string s in Qml...
                            the string which i am passing through the signal...i want to compare that in qml and next give functionality for that...

                            i used the following code but didn't get...

                            onPlaymusicsignal: {
                                                console.log("Recorded Voice :" + recordedString)
                                                var receivedString = recordedString
                                                console.log(receivedString)
                                                if(receivedString == "GOTO MUSIC")
                                                {
                                                    console.log("play music")
                                                }
                                                else
                                                {
                                                    console.log("please try again")
                                                }
                                            }
                            

                            even though the received string is GOTO MUSIC its printing in the console as please try again.

                            jsulmJ Offline
                            jsulmJ Offline
                            jsulm
                            Lifetime Qt Champion
                            wrote on last edited by
                            #23

                            @Naveen_D I'm not JavaScript expert (what QML basically is), but as far as I know you can use === instead of ==
                            If there maybe a new line at the end of receivedString ?

                            https://forum.qt.io/topic/113070/qt-code-of-conduct

                            Naveen_DN 1 Reply Last reply
                            0
                            • jsulmJ jsulm

                              @Naveen_D I'm not JavaScript expert (what QML basically is), but as far as I know you can use === instead of ==
                              If there maybe a new line at the end of receivedString ?

                              Naveen_DN Offline
                              Naveen_DN Offline
                              Naveen_D
                              wrote on last edited by
                              #24

                              @jsulm @VRonin i just tried with that... i don't know do i need to use javascript for this or wat...i simply tried once with that code...
                              Is it necessary to javascript to do this...because in Qt i use to do it using == so i thought here it will be the same...

                              Naveen_D

                              jsulmJ 1 Reply Last reply
                              0
                              • Naveen_DN Naveen_D

                                @jsulm @VRonin i just tried with that... i don't know do i need to use javascript for this or wat...i simply tried once with that code...
                                Is it necessary to javascript to do this...because in Qt i use to do it using == so i thought here it will be the same...

                                jsulmJ Offline
                                jsulmJ Offline
                                jsulm
                                Lifetime Qt Champion
                                wrote on last edited by
                                #25

                                @Naveen_D QML is JavaScript.
                                Did you check the link provided by @VRonin ?

                                https://forum.qt.io/topic/113070/qt-code-of-conduct

                                Naveen_DN 1 Reply Last reply
                                0
                                • jsulmJ jsulm

                                  @Naveen_D QML is JavaScript.
                                  Did you check the link provided by @VRonin ?

                                  Naveen_DN Offline
                                  Naveen_DN Offline
                                  Naveen_D
                                  wrote on last edited by
                                  #26

                                  @jsulm ya i checked...after checking that code only i used var in the code as shown above...but i didn't get that clearly so posted this in forum.

                                  Naveen_D

                                  jsulmJ 1 Reply Last reply
                                  0
                                  • Naveen_DN Naveen_D

                                    @jsulm ya i checked...after checking that code only i used var in the code as shown above...but i didn't get that clearly so posted this in forum.

                                    jsulmJ Offline
                                    jsulmJ Offline
                                    jsulm
                                    Lifetime Qt Champion
                                    wrote on last edited by
                                    #27

                                    @Naveen_D

                                    if(receivedString.localeCompare("GOTO MUSIC") == 0)
                                    {
                                        console.log("play music")
                                    }
                                    else
                                    {
                                        console.log("please try again")
                                    }
                                    

                                    https://forum.qt.io/topic/113070/qt-code-of-conduct

                                    Naveen_DN 1 Reply Last reply
                                    0
                                    • jsulmJ jsulm

                                      @Naveen_D

                                      if(receivedString.localeCompare("GOTO MUSIC") == 0)
                                      {
                                          console.log("play music")
                                      }
                                      else
                                      {
                                          console.log("please try again")
                                      }
                                      
                                      Naveen_DN Offline
                                      Naveen_DN Offline
                                      Naveen_D
                                      wrote on last edited by
                                      #28

                                      @jsulm
                                      i tried with both the codes...its going to else part.

                                      onPlaymusicsignal: {
                                                          console.log("Recorded Voice :" + recordedString)
                                                          var receivedString = recordedString
                                                          console.log(receivedString)
                                                          if(receivedString.localeCompare("GOTO MUSIC") == 0)
                                                          {
                                                              console.log("play music")
                                                              musicScreen.visible= true
                                                          }
                                                          else
                                                          {
                                                              console.log("please try again")
                                                          }
                                      
                                      onPlaymusicsignal: {
                                                          console.log("Recorded Voice :" + recordedString)
                                                          var receivedString = recordedString
                                                          var GotoMusicString = new String("GOTO MUSIC")
                                                          console.log(receivedString)
                                                          if(receivedString.localeCompare(GotoMusicString) == 0)
                                                          {
                                                              console.log("play music")
                                                              musicScreen.visible= true
                                                          }
                                                          else
                                                          {
                                                              console.log("please try again")
                                                          }
                                                      }
                                      

                                      Naveen_D

                                      jsulmJ 1 Reply Last reply
                                      0
                                      • Naveen_DN Naveen_D

                                        @jsulm
                                        i tried with both the codes...its going to else part.

                                        onPlaymusicsignal: {
                                                            console.log("Recorded Voice :" + recordedString)
                                                            var receivedString = recordedString
                                                            console.log(receivedString)
                                                            if(receivedString.localeCompare("GOTO MUSIC") == 0)
                                                            {
                                                                console.log("play music")
                                                                musicScreen.visible= true
                                                            }
                                                            else
                                                            {
                                                                console.log("please try again")
                                                            }
                                        
                                        onPlaymusicsignal: {
                                                            console.log("Recorded Voice :" + recordedString)
                                                            var receivedString = recordedString
                                                            var GotoMusicString = new String("GOTO MUSIC")
                                                            console.log(receivedString)
                                                            if(receivedString.localeCompare(GotoMusicString) == 0)
                                                            {
                                                                console.log("play music")
                                                                musicScreen.visible= true
                                                            }
                                                            else
                                                            {
                                                                console.log("please try again")
                                                            }
                                                        }
                                        
                                        jsulmJ Offline
                                        jsulmJ Offline
                                        jsulm
                                        Lifetime Qt Champion
                                        wrote on last edited by
                                        #29

                                        @Naveen_D Maybe receivedString contains a new line character at the end?

                                        https://forum.qt.io/topic/113070/qt-code-of-conduct

                                        Naveen_DN 1 Reply Last reply
                                        0
                                        • jsulmJ jsulm

                                          @Naveen_D Maybe receivedString contains a new line character at the end?

                                          Naveen_DN Offline
                                          Naveen_DN Offline
                                          Naveen_D
                                          wrote on last edited by
                                          #30

                                          @jsulm this is the output i am getting from the started process and the same output i am sending through the signal to qml

                                          output>>>> "\n<<< please speak >>> \n\n \n\n"

                                          output>>>> "Received Command: "GOTO MUSIC"\n"

                                          Output of regular exp is: ""GOTO MUSIC""
                                          signal data is >> ""GOTO MUSIC""

                                          qml: Recorded Voice :"GOTO MUSIC"
                                          qml: "GOTO MUSIC"
                                          qml: please try again

                                          Naveen_D

                                          jsulmJ 2 Replies Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt
                                          • Unsolved