[PyQt] Threads with PyQt. Qt's or Python's?

Giovanni Bajo rasky at develer.com
Tue Feb 3 13:12:56 GMT 2009

On 2/3/2009 12:24 PM, Frédéric wrote:
> Le 3/2/2009, "Giovanni Bajo" <rasky at develer.com> a écrit:
>>> The documentation says that a QPainter can only paint on QImage, QPrinter
>>> and QPicture, but not on QWidget and QPixmap (it seems that painting on
>>> QGraphicsItem works fine, as I don't have warnings; can you confirm?).
>> I'm unsure but yes, it probably works because it's a simply a QImage
>> under the hoods.
> Ok.
>> Read the documentation about connecting signals and slots across threads
>> (asynchronous thread connection). What you want is to simply emit a
>> signal from the thread (self.emit(SIGNAL("UPDATED_PROGRESS"), value)),
>> and connect to that signal from the main thread; in the slot, update the
>> widget.
>> The trick is that a signal/slot connection across a thread is different
>>from a normal one: in a normal connection, slots are called immediately,
>> within the "emit()" call. Instead, in an asynchronous connection, when
>> the signal is emitted, an event is posted to the main thread (posting
>> events is thread-safe); then the receiving thread's exec loop will
>> process the event and call the correct slot.
> Ok, I got it! I'll try to implement this...
> Thanks again for your help :o)
> PS: does it already exist a simple solution to adapt this code:
>     thread = threading.Thread(target=func)
>     thread.start()
> using QThread?

Yes: QtConcurrent::run.
Giovanni Bajo
Develer S.r.l.

More information about the PyQt mailing list