Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QProcess: start a compiled c program and output to textBrowser in Linux

QProcess: start a compiled c program and output to textBrowser in Linux

Scheduled Pinned Locked Moved Unsolved General and Desktop
executec programqprocesstextbrowserlinux
13 Posts 6 Posters 4.2k Views
  • 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.
  • N Offline
    N Offline
    Naim
    wrote on last edited by
    #1

    I have search and looked at other examples but nothing seems to work.
    Here are where I've referred to:
    http://www.qtforum.org/article/3079/howto-start-an-external-program-from-a-qt-application.html
    http://doc.qt.io/qt-5/qprocess.html
    and a few others

    Here's what I have in my project:
    mainwindow.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    private slots:
        void on_pushButton_clicked();
    
    private:
        Ui::MainWindow *ui;
    };
    
    #endif // MAINWINDOW_H
    

    main.cpp

    #include "mainwindow.h"
    #include <QApplication>
    #include <QPushButton>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
    
        return a.exec();
    }
    

    mainwindow.cpp

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QProcess>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::on_pushButton_clicked()
    {
        QProcess proc;
        proc.start("/root/Desktop/a.out");
    
        proc.waitForFinished();
        QString output = proc.readAllStandardOutput();
        ui->textBrowser->setText(output);
    }
    

    mainwindow.ui

    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>MainWindow</class>
     <widget class="QMainWindow" name="MainWindow">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>683</width>
        <height>519</height>
       </rect>
      </property>
      <property name="maximumSize">
       <size>
        <width>1112</width>
        <height>625</height>
       </size>
      </property>
      <property name="windowTitle">
       <string>MainWindow</string>
      </property>
      <widget class="QWidget" name="centralWidget">
       <widget class="QTextBrowser" name="textBrowser">
        <property name="geometry">
         <rect>
          <x>20</x>
          <y>50</y>
          <width>631</width>
          <height>191</height>
         </rect>
        </property>
       </widget>
       <widget class="QWidget" name="layoutWidget">
        <property name="geometry">
         <rect>
          <x>20</x>
          <y>10</y>
          <width>631</width>
          <height>30</height>
         </rect>
        </property>
        <layout class="QHBoxLayout" name="horizontalLayout">
         <item>
          <widget class="QPushButton" name="pushButton">
           <property name="text">
            <string>Start pcap (100p)</string>
           </property>
          </widget>
         </item>
         <item>
          <spacer name="horizontalSpacer">
           <property name="orientation">
            <enum>Qt::Horizontal</enum>
           </property>
           <property name="sizeHint" stdset="0">
            <size>
             <width>200</width>
             <height>20</height>
            </size>
           </property>
          </spacer>
         </item>
        </layout>
       </widget>
      </widget>
      <widget class="QMenuBar" name="menuBar">
       <property name="geometry">
        <rect>
         <x>0</x>
         <y>0</y>
         <width>683</width>
         <height>25</height>
        </rect>
       </property>
      </widget>
      <widget class="QToolBar" name="mainToolBar">
       <attribute name="toolBarArea">
        <enum>TopToolBarArea</enum>
       </attribute>
       <attribute name="toolBarBreak">
        <bool>false</bool>
       </attribute>
      </widget>
      <widget class="QStatusBar" name="statusBar"/>
     </widget>
     <layoutdefault spacing="6" margin="11"/>
     <resources/>
     <connections/>
    </ui>
    
    

    When I clicked the pushButton nothing happens but if I tried using Linux system's command in the QProcess such as

        QProcess proc;
        proc.start("ls -al");
    
        proc.waitForFinished();
        QString output = proc.readAllStandardOutput();
        ui->textBrowser->setText(output);
    

    It works where in the textBrowser it will list files/folders in the home directory.
    I've also tried with sh -c but still doesn't work.

        proc.start("sh", QStringList() << "-c" << "/root/Desktop/a.out");
    

    Is there way to execute a compiled c program using QProcess?
    I'm at lost

    JonBJ 1 Reply Last reply
    0
    • ? Offline
      ? Offline
      A Former User
      wrote on last edited by
      #2

      Hi, welcome to the forum. Check the ProcessError to get a hint on what went wrong. Also, add a call to waitForStarted and see if it hangs. Judging by the pathname, your a.out is owned by the user root. I assume you're not logged in as root so you probably don't have the sufficient access rights to run that executable.

      N 1 Reply Last reply
      2
      • mrjjM Offline
        mrjjM Offline
        mrjj
        Lifetime Qt Champion
        wrote on last edited by mrjj
        #3

        Hi
        Besides what @Wieland suggests
        did you try open a shell and just type
        /root/Desktop/a.out

        and see if it can run ?

        in some cases it wants
        chmod +x a.out

        to even be allowed to run.
        (normally the compiler / linker does that for you)

        1 Reply Last reply
        1
        • N Naim

          I have search and looked at other examples but nothing seems to work.
          Here are where I've referred to:
          http://www.qtforum.org/article/3079/howto-start-an-external-program-from-a-qt-application.html
          http://doc.qt.io/qt-5/qprocess.html
          and a few others

          Here's what I have in my project:
          mainwindow.h

          #ifndef MAINWINDOW_H
          #define MAINWINDOW_H
          
          #include <QMainWindow>
          
          namespace Ui {
          class MainWindow;
          }
          
          class MainWindow : public QMainWindow
          {
              Q_OBJECT
          
          public:
              explicit MainWindow(QWidget *parent = 0);
              ~MainWindow();
          
          private slots:
              void on_pushButton_clicked();
          
          private:
              Ui::MainWindow *ui;
          };
          
          #endif // MAINWINDOW_H
          

          main.cpp

          #include "mainwindow.h"
          #include <QApplication>
          #include <QPushButton>
          
          int main(int argc, char *argv[])
          {
              QApplication a(argc, argv);
              MainWindow w;
              w.show();
          
              return a.exec();
          }
          

          mainwindow.cpp

          #include "mainwindow.h"
          #include "ui_mainwindow.h"
          #include <QProcess>
          
          MainWindow::MainWindow(QWidget *parent) :
              QMainWindow(parent),
              ui(new Ui::MainWindow)
          {
              ui->setupUi(this);
          }
          
          MainWindow::~MainWindow()
          {
              delete ui;
          }
          
          void MainWindow::on_pushButton_clicked()
          {
              QProcess proc;
              proc.start("/root/Desktop/a.out");
          
              proc.waitForFinished();
              QString output = proc.readAllStandardOutput();
              ui->textBrowser->setText(output);
          }
          

          mainwindow.ui

          <?xml version="1.0" encoding="UTF-8"?>
          <ui version="4.0">
           <class>MainWindow</class>
           <widget class="QMainWindow" name="MainWindow">
            <property name="geometry">
             <rect>
              <x>0</x>
              <y>0</y>
              <width>683</width>
              <height>519</height>
             </rect>
            </property>
            <property name="maximumSize">
             <size>
              <width>1112</width>
              <height>625</height>
             </size>
            </property>
            <property name="windowTitle">
             <string>MainWindow</string>
            </property>
            <widget class="QWidget" name="centralWidget">
             <widget class="QTextBrowser" name="textBrowser">
              <property name="geometry">
               <rect>
                <x>20</x>
                <y>50</y>
                <width>631</width>
                <height>191</height>
               </rect>
              </property>
             </widget>
             <widget class="QWidget" name="layoutWidget">
              <property name="geometry">
               <rect>
                <x>20</x>
                <y>10</y>
                <width>631</width>
                <height>30</height>
               </rect>
              </property>
              <layout class="QHBoxLayout" name="horizontalLayout">
               <item>
                <widget class="QPushButton" name="pushButton">
                 <property name="text">
                  <string>Start pcap (100p)</string>
                 </property>
                </widget>
               </item>
               <item>
                <spacer name="horizontalSpacer">
                 <property name="orientation">
                  <enum>Qt::Horizontal</enum>
                 </property>
                 <property name="sizeHint" stdset="0">
                  <size>
                   <width>200</width>
                   <height>20</height>
                  </size>
                 </property>
                </spacer>
               </item>
              </layout>
             </widget>
            </widget>
            <widget class="QMenuBar" name="menuBar">
             <property name="geometry">
              <rect>
               <x>0</x>
               <y>0</y>
               <width>683</width>
               <height>25</height>
              </rect>
             </property>
            </widget>
            <widget class="QToolBar" name="mainToolBar">
             <attribute name="toolBarArea">
              <enum>TopToolBarArea</enum>
             </attribute>
             <attribute name="toolBarBreak">
              <bool>false</bool>
             </attribute>
            </widget>
            <widget class="QStatusBar" name="statusBar"/>
           </widget>
           <layoutdefault spacing="6" margin="11"/>
           <resources/>
           <connections/>
          </ui>
          
          

          When I clicked the pushButton nothing happens but if I tried using Linux system's command in the QProcess such as

              QProcess proc;
              proc.start("ls -al");
          
              proc.waitForFinished();
              QString output = proc.readAllStandardOutput();
              ui->textBrowser->setText(output);
          

          It works where in the textBrowser it will list files/folders in the home directory.
          I've also tried with sh -c but still doesn't work.

              proc.start("sh", QStringList() << "-c" << "/root/Desktop/a.out");
          

          Is there way to execute a compiled c program using QProcess?
          I'm at lost

          JonBJ Offline
          JonBJ Offline
          JonB
          wrote on last edited by
          #4

          @Naim , @mrjj
          If you like trivia (you probably don't...), you can actually execute it without the execute bit set via the accepted answer to https://superuser.com/questions/341439/can-i-execute-a-linux-binary-without-the-execute-permission-bit-being-set :)

          mrjjM 1 Reply Last reply
          1
          • JonBJ JonB

            @Naim , @mrjj
            If you like trivia (you probably don't...), you can actually execute it without the execute bit set via the accepted answer to https://superuser.com/questions/341439/can-i-execute-a-linux-binary-without-the-execute-permission-bit-being-set :)

            mrjjM Offline
            mrjjM Offline
            mrjj
            Lifetime Qt Champion
            wrote on last edited by
            #5

            @JNBarchan
            But does it set the bit ?
            chmod a-x /tmp/ls

            aha_1980A 1 Reply Last reply
            0
            • ? A Former User

              Hi, welcome to the forum. Check the ProcessError to get a hint on what went wrong. Also, add a call to waitForStarted and see if it hangs. Judging by the pathname, your a.out is owned by the user root. I assume you're not logged in as root so you probably don't have the sufficient access rights to run that executable.

              N Offline
              N Offline
              Naim
              wrote on last edited by Naim
              #6

              @Wieland Yes I'm using root. As for ProcessError and waitForStarted I'll reply that later
              @mrjj I compiled a.out as the root user

              mrjjM 1 Reply Last reply
              0
              • N Naim

                @Wieland Yes I'm using root. As for ProcessError and waitForStarted I'll reply that later
                @mrjj I compiled a.out as the root user

                mrjjM Offline
                mrjjM Offline
                mrjj
                Lifetime Qt Champion
                wrote on last edited by
                #7

                @Naim
                Ok, so you are logged in as root. so its not just rights issue.
                Hopefully ProcessError tells you why it cant run :)

                aha_1980A 1 Reply Last reply
                0
                • mrjjM mrjj

                  @Naim
                  Ok, so you are logged in as root. so its not just rights issue.
                  Hopefully ProcessError tells you why it cant run :)

                  aha_1980A Offline
                  aha_1980A Offline
                  aha_1980
                  Lifetime Qt Champion
                  wrote on last edited by
                  #8

                  @Naim: As @mrjj already asked earlier before:

                  Can you run /root/Desktop/a.out from the shell? It might be, that /root is on a partition that is mounted as no-executable. Why has to program to reside below /root?

                  Qt has to stay free or it will die.

                  N 1 Reply Last reply
                  1
                  • mrjjM mrjj

                    @JNBarchan
                    But does it set the bit ?
                    chmod a-x /tmp/ls

                    aha_1980A Offline
                    aha_1980A Offline
                    aha_1980
                    Lifetime Qt Champion
                    wrote on last edited by
                    #9

                    @mrjj said in QProcess: start a compiled c program and output to textBrowser in Linux:

                    @JNBarchan
                    But does it set the bit ?
                    chmod a-x /tmp/ls

                    chmod a-x /tmp/ls clears the executable bit ;)

                    Qt has to stay free or it will die.

                    mrjjM 1 Reply Last reply
                    1
                    • aha_1980A aha_1980

                      @mrjj said in QProcess: start a compiled c program and output to textBrowser in Linux:

                      @JNBarchan
                      But does it set the bit ?
                      chmod a-x /tmp/ls

                      chmod a-x /tmp/ls clears the executable bit ;)

                      mrjjM Offline
                      mrjjM Offline
                      mrjj
                      Lifetime Qt Champion
                      wrote on last edited by
                      #10

                      @aha_1980
                      ahh of course its -x :)
                      my brain said a TO x (facepalm)
                      So it can run without it using LD and some magic. Cool.

                      1 Reply Last reply
                      0
                      • aha_1980A aha_1980

                        @Naim: As @mrjj already asked earlier before:

                        Can you run /root/Desktop/a.out from the shell? It might be, that /root is on a partition that is mounted as no-executable. Why has to program to reside below /root?

                        N Offline
                        N Offline
                        Naim
                        wrote on last edited by
                        #11

                        @aha_1980 Yes I can run it in shell with ./root/Desktop/a.out. I'm using the root user on a virtual machine.

                        N 1 Reply Last reply
                        0
                        • N Naim

                          @aha_1980 Yes I can run it in shell with ./root/Desktop/a.out. I'm using the root user on a virtual machine.

                          N Offline
                          N Offline
                          Naim
                          wrote on last edited by
                          #12

                          I may have find the problem here. My C program a.out runs indefinitely and textBrowser only shows the output once my program have finished executing. I've tried to run another C program that accepts command line input to loop how many times. Its output shows up in textBrowser after it has done looping.

                          jsulmJ 1 Reply Last reply
                          0
                          • N Naim

                            I may have find the problem here. My C program a.out runs indefinitely and textBrowser only shows the output once my program have finished executing. I've tried to run another C program that accepts command line input to loop how many times. Its output shows up in textBrowser after it has done looping.

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

                            @Naim Use http://doc.qt.io/qt-5/qprocess.html#readyReadStandardOutput and http://doc.qt.io/qt-5/qprocess.html#readyReadStandardError to get notifications each time the process writes something to stdout or stderr and read it using http://doc.qt.io/qt-5/qprocess.html#readAllStandardOutput and http://doc.qt.io/qt-5/qprocess.html#readAllStandardError. Do not call waitForFinished, just make sure your proc does not go out of scope (make it class member).

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

                            1 Reply Last reply
                            3

                            • Login

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