TomographicImaging / eqt

A number of templates and tools to develop Qt GUI's with Python effectively.
Other
2 stars 3 forks source link

Add documentation on how the callbacks are passed to the worker #18

Closed paskino closed 3 years ago

paskino commented 3 years ago

The way a function that is run in a Worker receives one of the progress_callback, status_callback and message_callback is rather intricate and requires an explanation.

To run a function in a separate thread we use a Worker which is a subclass of a QRunnable.

For the Worker to work one needs to define:

  1. the function that does what you need
  2. Optional callback methods to get the status of the thread by means of QtCore.QSignals

On initialisation of the Worker the user needs to pass the function that has to run in the thread, i.e. fn below, and additional optional positional and keyword arguments, which will be passed on to the actual function that is run in the QRunnable.

https://github.com/paskino/qt-elements/blob/535e487d09d928713d7d6aa1123657597627c4b0/eqt/threading/QtThreading.py#L32

In practice the user will need to pass to the Worker as many parameters as there are listed in the function to be run.

https://github.com/paskino/qt-elements/blob/535e487d09d928713d7d6aa1123657597627c4b0/eqt/threading/QtThreading.py#L56

But before running that Worker will add to the **kwargs the following QSignal.

https://github.com/paskino/qt-elements/blob/535e487d09d928713d7d6aa1123657597627c4b0/eqt/threading/QtThreading.py#L41-L43

Therefore it is advisable to always have **kwargs in the function fn signature so that you can access the QSignal and emit the signal required. For instance one could emit a progress by

def fn(num_iter, **kwargs):
    progress_callback = kwargs.get('progress_callback', None)
    for i in range(num_iter):
        do_something
        if progress_callback is not None:
            progress_callback.emit( i )

But how are the signal passed to the Worker anyway?

This is done just after one has defined the Worker:


def handle_progress(num_iter):
    # do something with the progress
    print ("Current progress is ", num_iter)

worker = Worker(fn, 10)
worker.signals.progress.connect(handle_progress)

What are the available signals?

https://github.com/paskino/qt-elements/blob/535e487d09d928713d7d6aa1123657597627c4b0/eqt/threading/QtThreading.py#L83-L89

lauramurgatroyd commented 3 years ago

Closed by https://github.com/paskino/qt-elements/pull/19