[Qt-interest] newbie: application locks up
john doe
thebiggestbangtheory at gmail.com
Sat May 2 00:07:43 CEST 2009
On Fri, May 1, 2009 at 2:56 PM, john doe <thebiggestbangtheory at gmail.com>wrote:
>
>
> On Fri, May 1, 2009 at 1:12 PM, john doe <thebiggestbangtheory at gmail.com>wrote:
>
>>
>>
>> On Fri, May 1, 2009 at 2:47 AM, chandrasekar wagmare <
>> sekarwagmare at gmail.com> wrote:
>>
>>>
>>> use this two signals in QProcess() :
>>> void readyReadStandardOutput(); //when a stdoutput is available
>>>
>>> void readyReadStandardError(); //when a stderror is available
>>>
>>> and use QByteArray readAllStandardOutput(); and readAllStandardError() ;
>>> to read the std output or error of the external process in a QString and
>>> display it in the box;
>>>
>>>
>> This is great! thanks a ton!
>>
>>
>>>
>>> ay 1, 2009 at 1:19 PM, john doe <thebiggestbangtheory at gmail.com> wrote:
>>>
>>>>
>>>>
>>>> On Fri, May 1, 2009 at 12:46 AM, chandrasekar wagmare <
>>>> sekarwagmare at gmail.com> wrote:
>>>>
>>>>>
>>>>> u have two ways, invoking an external program using QProcess()
>>>>> and if u dont want the gui part freeze use QThread() .
>>>>>
>>>>
>>>> awesome! I will look them up.. and since we are on the topic how can I
>>>> set up a 2-way communication with the external program to display any error
>>>> msgs in a text box or something?
>>>>
>>>> Thanks again
>>>>
>>>>
>>>>> On Fri, May 1, 2009 at 1:08 PM, john doe <
>>>>> thebiggestbangtheory at gmail.com> wrote:
>>>>>
>>>>>> Hello all,
>>>>>> Still relative newbie with Qt. I have made my first form
>>>>>> containing combo buttons, lineedits and whatnot :-). I am facing a problem
>>>>>> though regarding calling an external program from within the C++ Qt code.
>>>>>>
>>>>>> I have a ubuntu system and want to invoke a shell script which does
>>>>>> some string manipulations on a large file. I used system() within the C++
>>>>>> code to do it and it runs. The problem is that when I press a button to
>>>>>> start the external program, if it takes 10 minutes to finish, the button
>>>>>> seems to be depressed for this duraion. Basically, like waiting for the
>>>>>> program to finish. How can I make the button not be depressed for this
>>>>>> complete duration so that I can possibly start another instance of the
>>>>>> external program by pressing a button on the main form.
>>>>>>
>>>>>> I am not an expert programmer, but I think this smells of asynchronous
>>>>>> calls..right? Any insight would be greatly appreciated :-).
>>>>>>
>>>>>> I did try using a & at the end of the external program I am invoking
>>>>>> but that does not help. Nothing runs. I am using kdesudo to start the
>>>>>> external program as it requires certain privileges.
>>>>>>
>>>>>> Also I tried to use a progress bar with minimum and max set to 0 to
>>>>>> continuosly work while the external program is running and it does not seem
>>>>>> to work. Any pointers to threads/articles?
>>>>>>
>>>>>> Thanks in advance.
>>>>>>
>>>>>> _______________________________________________
>>>>>> Qt-interest mailing list
>>>>>> Qt-interest at trolltech.com
>>>>>> http://lists.trolltech.com/mailman/listinfo/qt-interest
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> WAGMARE
>>>>>
>>>>
>>>>
>>>
>>>
>>> --
>>> WAGMARE
>>>
>>
>> Thanks everyone for helping out. I used the suggestions to write up some
> code..which unfortunately does not work.. its probably some easy thing that
> I am not identifying!
>
> I am using Qt 4.4.3, on Ubuntu 8.10 and am using QDevelop as an IDE. I have
> 3 files dialogimpl.h, min.cpp and dialogimpl.cpp. The code follows below.
>
> dialogimpl.h
> [code]
>
> #ifndef DIALOGIMPL_H
>
> #define DIALOGIMPL_H
>
> //
>
> #include <QDialog>
>
> #include "ui_dialog.h"
>
> //
>
> class DialogImpl : public QDialog, public Ui::mygui
>
> {
>
> Q_OBJECT
>
> public:
>
> DialogImpl( QWidget * parent = 0, Qt::WFlags f = 0 );
>
> public slots:
>
> void getPathdir();
>
> void getPathsisterfile();
>
> void startjob();
>
> void readstdoutput();
>
> };
>
> #endif
> [/code]
>
> main.cpp contains
> [code]
>
> #include <QApplication>
>
> #include "dialogimpl.h"
>
> //
>
> int main(int argc, char ** argv)
>
> {
>
> QApplication app( argc, argv );
>
> DialogImpl win;
>
> win.show();
>
> app.connect( &app, SIGNAL( lastWindowClosed() ), &app, SLOT( quit() ) );
>
> return app.exec();
>
> }
>
> [/code]
>
> and finally dialogimpl.cpp contains
> [code]
>
> #include <QtGui>
>
> #include "dialogimpl.h"
>
> #include <stdio.h>
>
> #include <stdlib.h>
>
> #include <iostream>
>
> #include <fstream>
>
> #include <QThread>
>
> using namespace std;
>
> //code still being tested
>
> QObject *parent;
>
> QString program;
>
> QProcess *myProcess = new QProcess(parent);
>
> QStringList arguments;
>
> //
>
> DialogImpl::DialogImpl( QWidget * parent, Qt::WFlags f)
>
> : QDialog(parent, f)
>
> {
>
> setupUi(this);
>
> // signals/slots mechanism in action
>
> connect( startjobpushButton, SIGNAL( clicked() ), this, SLOT( startjob() )
> );
>
> connect( pushButton_browse_1, SIGNAL( clicked() ), this, SLOT( getPathdir()
> ) );
>
> connect( pushButton_browse_2, SIGNAL( clicked() ), this, SLOT(
> getPathsisterfile() ) );
>
> connect(myProcess, SIGNAL(readyReadStandardOutput()), this,
> SLOT(readstdoutput()));
>
> }
>
>
> //This function makes does something
>
> void DialogImpl::startjob()
>
> {
>
> //declare vars
>
> ....
>
> //make a config file
>
> QFile file("/home/temporary-file.txt");
>
> QString line;
>
> if ( file.open(QIODevice::WriteOnly) ) {
>
> // file opened successfully
>
> // use a text stream
>
> QTextStream out( &file );
>
> out << "Target=" << Target << endl;
>
> // Close the file
>
> file.close();
>
> //start the job
>
> program="echo";
>
> arguments << "hello";
>
> myProcess->start(program, arguments);
>
> //remove the file
>
> file.remove();
>
> }
>
> else
>
> {
>
> //failed to open file
>
> textEdit_output->insertPlainText("ERROR: Failed to create temporary file");
>
> }
>
> }
>
> //This function allows for the user to
>
> //read std output
>
> void DialogImpl::readstdoutput()
>
> {
>
> QString output;
>
> output=myProcess->readAllStandardOutput();
>
>
I should have read it in QByteArray as suggested..god! ... seems to work
now.
> textEdit_output->insertPlainText("ERROR: test msg to be displayed in text
> box");
>
> textEdit_output->append(output);
>
> }
>
> [/code]
>
> What I want to do is when I click startjobpushbutton, a process should be
> invoked, which does "echo hello" and I should be able to see "hello" in the
> textEdit_ouput text box. Currently, when I click the button nothing happens.
> Can someone please provide a little insight.
>
> Thanks in advance.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.qt-project.org/pipermail/qt-interest-old/attachments/20090501/c3577dd4/attachment.html
More information about the Qt-interest-old
mailing list