[PySide] a couple of QProgressDialog questions

Sebastian Elsner sebastian at risefx.com
Tue Sep 3 10:05:22 CEST 2013

One thing to clarify. Neither QThread nor QProgressDialog go into the 
subclass of the QObject. They are all top level objects.

On 09/03/2013 10:01 AM, Sebastian Elsner wrote:
> On 09/03/2013 08:31 AM, Frank Rueter | OHUfx wrote:
>> Hi everybody,
>> after almost a year of having to neglect PySide I'm finally making some
>> time for it again, only to feel like I almost forgot everything I
>> learned :-D
>> I'm trying to do something fairly common and wanted to sanity check my
>> approach, so here is my sandbox script to figure out how to use
>> QProgressDialog:
>> http://pastebin.com/4kVhPiUx
>> It all works as expected except for the fact that when I hit cancel, the
>> progress stops (as expected), and the second time I hit the cancel
>> button the dialog closes. Seems wrong, and I'm sure I should be doing it
>> better, so that the progress stops and the dialog closes at the same
>> time. This behaviour seems to be the same even if setAutoClose() is set
>> to True.
> auto close only works if the current progress value is equal with the
> maximum value.
>> Should manually close the window when wasCanceled() is true, or set the
>> progress' value to it's maximum to let auroClose take over? Or is there
>> a better way?
> I normally do dlg.setValue(dlg.maximum()) and let autoclose do the rest,
> because afaik it also takes care of resetting stuff
>> My second question is:
>> What is the best approach to connect a QProgressDialog to another thread
>> that is running a command line application?
>> I'm guessing I should write a wrapper around the external application
>> (using QEvent or QProcess?), grabbing it's stdout, parsing it to get the
>> actual progress value, then connecting that to the QProgressDialog widget.
>> Is that the way to do it?
> Thats basically it. Your example suggests, that you want to put the
> computation code in the QProgressDialog subclass - don't. This is how
> the pieces should work together:
> Create a subclass of QObject. This is your object, that launches the
> QProgress and runs in its own thread watching and parsing the output of
> the QProgress. This class communicates ONLY via signals and slots with
> the main thread (normal method calls to the QProgress/within the thread
> are OK). This means you need a signal, which signals what the current
> progress is. Do not follow the old QThread documentation it is WRONG :)
> Read up on this topic here:
> http://blog.qt.digia.com/blog/2010/06/17/youre-doing-it-wrong/ and get a
> recent 4.8.4 documentation. Move this QObject to a QThread instance and
> connect the usual signals according to the docs. Create a
> QProgressDialog, connecting the canceled signal to a slot in your
> QObject to signal to stop the computation. Connect the progress signal
> from the QObject to the setValue of your progress dialog. For this to
> work you do only need to subclass QObject.
>> Ultimately I would like a simple Dialog, that has both a progress bar
>> and a text widget, to show the application's stdout as well as the
>> overall progress.
> Thats totally possible, just fire up qtdesigner and put it together.
> As an exercise you could try to de-couple this new dialog totally from
> the actual type of command line program it is running by providing a way
> to generally configure the command line to run and a regex to parse the
> stdout for progress.
>> Am I on the right track or are there easier/better ways?
>> Cheers,
>> frank
>> _______________________________________________
>> PySide mailing list
>> PySide at qt-project.org
>> http://lists.qt-project.org/mailman/listinfo/pyside

check out www.pointcloud9.com

Sebastian Elsner - Pipeline Technical Director - RISE

t: +49 30 20180300 florian at risefx.com
f: +49 30 61651074 www.risefx.com

Schlesische Strasse 28, Aufgang B, 10997 Berlin
c/o action concept, An der Hasenkaule 1-7, 50354 Hürth
Geschaeftsfuehrer: Sven Pannicke, Robert Pinnow
Handelsregister Berlin HRB 106667 B

More information about the PySide mailing list