problem mit QProcess-Qstring-ausgabe



  • ich versuche verzweifelt einen prozess auf einem textedit-feld anzuzeigen. und zwar so das es, synchron zur ausgabe die auf der konsole stattfinden würde, aktualisiert wird.
    ich schaffe es aber einfach nicht 😞

    void Form1::conf_pipe(/*QString com*/)
    {  
        connect(&prc, SIGNAL(readyReadStdout() ), this, SLOT(daten() ) );
        prc.addArgument("./configure");
        prc.start(); //prc == QProcess
    
        while(prc.isRunning() )
        {    
           //textEdit_log->setText( strlist.join( "\n" ) );
        }
        textEdit_log->setText( strlist.join( "\n" ) ); 
    }
    
    void Form1::daten()
    {
        strlist.append(prc.readLineStdout() ); //QStringlist
    }
    

    die obere funktion wird von

    void Form1::conf()
    {
      options = lineEdit_parameters->displayText();
      target_path = lineEdit_path->displayText();
    
      short pos = s_file.find(".tar" , 0);
      s_filepath = s_file.left(pos);
    
      chdir(s_filepath); //cd ..
      cout<<s_filepath<<endl;
      cout<<"bearbeite ./configure script"<<endl;
      conf_pipe();
      //textEdit_log->setText( strlist.join( "\n" ) ); 
    }
    

    aufgerufen.
    ich möchte wissen wie ich das vernünftig bewerkstelligen könnte?



  • Wenn du in der while Schleife deine Däumchen drehst, kann ja sonst nichts gemacht werden. Du musst schon die Funktion verlassen und auf Signale warten.



  • Zusätzlich: QTextEdit kann ganz einfach als Log fungieren:

    Mit setTextFormat(LogText) wird der Modus umgestellt, so das das Objekt für Logs optimiert wird. Dann kannst du einfach per append() neue Zeilen an dein Log anhängen.



  • soin der amin hab ich jetzt:

    Form1 w;
    
        w.textEdit_log->setTextFormat(Qt::LogText);
    

    und inder impl.

    void Form1::conf_pipe(/*QString com*/)
    {  
        connect(&prc, SIGNAL(readyReadStdout() ), this, SLOT(daten() ) );
        prc.addArgument("./configure");
        prc.start();
    
        while(prc.isRunning() )
        {    
           //textEdit_log->setText( strlist.join( "\n" ) );
        }
        //textEdit_log->append( strlist.join( "\n" ) ); 
    }
    
    void Form1::daten()
    {
        strlist.append(prc.readLineStdout() ); 
        textEdit_log->append( strlist.join( "\n" ) ); 
    }
    

    allerdings ohne erfolg, langsam bin am verzweifeln. 😡



  • Ponto schrieb:

    Wenn du in der while Schleife deine Däumchen drehst, kann ja sonst nichts gemacht werden. Du musst schon die Funktion verlassen und auf Signale warten.

    könntest du bitte ein bsp. machen



  • bb-2 schrieb:

    soin der amin hab ich jetzt:

    Form1 w;
        
        w.textEdit_log->setTextFormat(Qt::LogText);
    

    und inder impl.

    void Form1::conf_pipe(/*QString com*/)
    {  
        connect(&prc, SIGNAL(readyReadStdout() ), this, SLOT(daten() ) );
        prc.addArgument("./configure");
        prc.start();
       
        while(prc.isRunning() )
        {    
           //textEdit_log->setText( strlist.join( "\n" ) );
        }
        //textEdit_log->append( strlist.join( "\n" ) ); 
    }
    
    void Form1::daten()
    {
        strlist.append(prc.readLineStdout() ); 
        textEdit_log->append( strlist.join( "\n" ) ); 
    }
    

    allerdings ohne erfolg, langsam bin am verzweifeln. 😡

    Du hast ja immer noch die schleife drin:

    while(prc.isRunning() )
    {    
    //textEdit_log->setText( strlist.join( "\n" ) );
    }
    

    Solange also der process läuft, macht deine Anwendung nichts.



  • bb-2 schrieb:

    Ponto schrieb:

    Wenn du in der while Schleife deine Däumchen drehst, kann ja sonst nichts gemacht werden. Du musst schon die Funktion verlassen und auf Signale warten.

    könntest du bitte ein bsp. machen

    Mach du erstmal eine kleine Anwendung die die Ausgabe von einem einfachen Programm wie zum Beispiel "ps auxwww" an ein Log dranhängt, soweit du kannst. Das stellst du dann ins Forum und wir können es dann korrigieren. Ich hab keine Zeit ein komplettes Beispiel zu schreiben.



  • kein komplettes aber zum. das kann man ja versuchen zu korrigieren.
    ich hatte es ja schon soweit das der komplette prozess log am ende des prozesses angezeigt wird.
    ich glaub das sah so aus:

    while(prc.isRunning() )
        {
        if(prc.canReadLineStdout() )
           strlist.append(prc.readLineStdout() );
        textEdit_log->setText( strlist.join( "\n" ) );
        }
    

    aber das ist ja nicht mein problem!



  • wenn das nicht ganz war was du meintest dann mach ich gerne noch eine extraanwendung!
    einmal war es irgendwie so, das der text jedesmal nachdem ich den funktions-aufrufenden button gedrückt hatte erweitert wurde-> es waren allerdings viele leere zeilen dazwischen und er hatte sich eben nur nach drücken akualisiert. dummerweise hab ich den code überschrieben 😞 sah aber ähnlich aus.



  • bb-2 schrieb:

    wenn das nicht ganz war was du meintest dann mach ich gerne noch eine extraanwendung!
    einmal war es irgendwie so, das der text jedesmal nachdem ich den funktions-aufrufenden button gedrückt hatte erweitert wurde-> es waren allerdings viele leere zeilen dazwischen und er hatte sich eben nur nach drücken akualisiert. dummerweise hab ich den code überschrieben 😞 sah aber ähnlich aus.

    Mach mal eine kleine Extraanwendung.



  • also mit dem designer:
    implentation

    #include <qprocess.h>
    #include <qstringlist.h>
    
    void Form1::go()
    {
        QProcess prc;
        //connect(prc, SIGNAL(readyReadStdout() ), this, );
        prc.addArgument("./configure");
        chdir("/home/dgrat/downloads/eagle-usb-2.3.2");
        prc.start();
    
        while(prc.isRunning() )
        {
    	textEdit->append(prc.readLineStdout() );
        }  
    }
    

    main:

    #include <qapplication.h>
    #include "form1.h"
    #include <qtextedit.h>
    
    int main( int argc, char ** argv )
    {
        QApplication a( argc, argv );
        Form1 w;
        w.textEdit->setTextFormat(Qt::LogText);
        w.show();
        a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
        return a.exec();
    }
    

    nun der text wird jetzt aktualisiert, wie ich es wollte!!! ABER er scheint nicht vollständig zu sein???
    probiert ihn bitte mal aus. einfach einen button und ein textedit erstellen code einfügen, pfad (oben) ändern und mal configure-ieren lassen 🙂 ->
    PONTO! 😡
    ok- nun zur frage: der text hat ein etwas eigenartiges verhalten, aber das werdet ihr sehen wenn ihr es mal ausprobiert. (ich hoffe jemand wird mal waszum kompillieren haben)



  • Das ist kein komplettes Beispiel. Ich hab mal trotzdem ein Programm erstellt, das die Vorgehensweise darstellt. Aber das nächste mal machst du ein vollständiges Programm, wenn du Hilfe haben möchtest.

    main.cpp:

    #include <qapplication.h>
    
    #include "form1.h"
    
    int main( int argc, char ** argv )
    {
       QApplication a( argc, argv );
       Form1 w;
       w.textEdit1->setTextFormat(Qt::LogText);
       w.show();
       a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
       return a.exec();
    }
    

    form1.h:

    #ifndef FORM1_H
    #define FORM1_H
    
    #include <qdialog.h>
    #include <qprocess.h>
    #include <qtextedit.h>
    #include <qpushbutton.h>
    
    class QPushButton;
    
    class Form1 : public QDialog
    {
        Q_OBJECT
    
    public:
        Form1( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
    
        QTextEdit* textEdit1;
        QPushButton* pushButton1;
    
    public slots:
       void go();
       void ready();
       void finish();
    
    private:
         QProcess prc;
    };
    
    #endif // FORM1_H
    

    form1.cpp:

    #include "form1.h"
    
    void Form1::go()
    {
       prc.addArgument("find");
       prc.addArgument("/");
       prc.addArgument("-name");
       prc.addArgument("*ar*");
       prc.start();
    }
    
    Form1::Form1( QWidget* parent, const char* name, bool modal, WFlags fl )
        : QDialog( parent, name, modal, fl )
    {
       textEdit1 = new QTextEdit( this, "textEdit1" );
       textEdit1->setGeometry( QRect( 10, 210, 561, 241 ) );
    
       pushButton1 = new QPushButton( this, "pushButton1" );
       pushButton1->setText( "Go");
       pushButton1->setGeometry( QRect( 110, 50, 104, 24 ) );
       resize( QSize(600, 480).expandedTo(minimumSizeHint()) );
       clearWState( WState_Polished );
    
       connect(pushButton1, SIGNAL(clicked()), this, SLOT(go()));
       connect(&prc, SIGNAL(readyReadStdout()), this, SLOT(ready()));
       connect(&prc, SIGNAL(processExited()), this, SLOT(finish()));
    }
    
    void Form1::ready() {
      while (prc.canReadLineStdout()) {
         textEdit1->append(prc.readLineStdout() );
      }
    }
    
    void Form1::finish() {
      textEdit1->append("Process finished");
    }
    


  • warum nutzt niemand den designer???

    danke



  • bb-2 schrieb:

    warum nutzt niemand den designer???

    danke

    Ich nutze den designer. Bei Kleinkram mache ich aber nur einmal den Dialog fertig und passe den Rest im Code an.

    Du kannst aber nicht erwarten, dass man sich hier hinsetzt und einen Dialog bastelt. Besser ist es, wenn du die .ui Datei mitgibst. Dann noch die .pro Datei oder ein Makefile, so dass jeder sofort dein Beispiel starten kann. Ansonsten sinkt doch die Bereitschaft dir zu helfen.



  • gut. werd ich das nächst mal beachten, dann post ich die ui.



  • toll, jetzt klappt alles wunderbar!!!


Log in to reply