Thanks Nathan.

I guess I will have to find some way to run the Python code in the main
thread of the application, or use processEvents in the mean time.

best regards

Sébastien Sablé

Le 8 février 2012 16:10, Nathan Smith <nathanjsm...@gmail.com> a écrit :

> This is an expected limitation due to how Qt works.  Even your C++ Qt
> application is required to have the GUI run in a single thread.  You can do
> work in other threads and emit signals across thread boundaries, but the
> event loop executes single-threaded.
>
>
> Although QObject is reentrant, the GUI classes, notably QWidget and all
> its subclasses, are not reentrant. They can only be used from the main
> thread. As noted earlier, QCoreApplication::exec() must also be called from
> that thread.
> http://developer.qt.nokia.com/doc/qt-4.8/threads-qobject.html
>
> Nathan
>
> 2012/2/8 Sébastien Sablé Sablé <sa...@users.sourceforge.net>
>
>> Hi Alberto,
>>
>> thank you for your answer!
>>
>> The event loop is actually running in a separate thread.
>> I managed to get the example running by adding a call to processEvents:
>>
>> from PySide import QtGui
>>
>> from PySide import QtCore
>>
>> wid = QtGui.QLabel("Whatever")
>>
>> wid.resize(450, 150)
>>
>> wid.setWindowTitle('Simple')
>>
>> wid.show()
>>
>> while True:
>>
>>     QtCore.QCoreApplication.processEvents()
>>
>>
>> I think I will use this workaround for the moment.
>> It is not clear to me however if this is an expected limitation due to
>> how Qt works with threads or if this is a bug in PySide.
>>
>> I would appreciate if someone could come with a cleaner solution or tell
>> me if I should fill a bug request.
>>
>> best regards
>>
>> --
>> Sébastien Sablé
>>
>>
>> Le 8 février 2012 15:12, Alberto Soto <alberto.s...@lmsintl.com> a écrit
>> :
>>
>> Hi Sébastien,
>>>
>>> This sounds to me like an event loop problem.
>>>
>>> The MessageBox::question static method creates its own event loop
>>>  and then returns. So that's probably the reason it works.
>>>
>>> Are you creating the QLabel widget in the same thread as the GUI
>>> application thread? I seem to remember a limitation, when working
>>>  on multithread Qt applications with a GUI.
>>>  From the "Rapid GUI Programming with Python and Qt" book:
>>> PyQt applications always have at least one thread of execution, the
>>> primary
>>> (initial) thread. In addition, they may create as many secondary threads
>>> as
>>> they need. However, if the application has a GUI, the GUI operations,
>>> such
>>> as executing the event loop, may only take place in the primary thread.
>>> -- chapter 19. Multithreading.
>>>
>>> Hope this helps!
>>>
>>>
>>> Alberto SOTO
>>>
>>>
>>> _______________________________________________________________________________________________________
>>> From: pyside-boun...@lists.pyside.org [mailto:
>>> pyside-boun...@lists.pyside.org] On Behalf Of Sébastien Sablé Sablé
>>> Sent: mercredi 8 février 2012 11:35
>>> To: pyside@lists.pyside.org
>>> Subject: [PySide] PySide in a C++ application using Qt
>>>
>>> Hi,
>>>
>>> I am using PySide 1.1.0. And I would like to use it inside a C++
>>> application that already uses Qt and provides an embedded Python
>>> interpreter.
>>>
>>> I tried something like that:
>>>
>>> from PySide import QtGui
>>> app = QtGui.QApplication.instance()
>>> print app
>>> wid = QtGui.QLabel("Whatever")
>>> wid.resize(450, 150)
>>> wid.setWindowTitle('Simple')
>>> wid.show()
>>>
>>>
>>> Since there is already a running QApplication, I do not create a new
>>> one. There is also a running event loop in another thread since the
>>> application interface reacts.
>>>
>>> This code snippet works partially:
>>> a new window is created, with a "simple" title, but the text inside it
>>> is never displayed and the windows does not react at all:
>>> I can't move it, resize it or anything.
>>>
>>> If I call "wid.repaint()", the text inside the window is correctly
>>> refreshed; however the window still does not react to any event.
>>>
>>> I also tried to create a message box like that:
>>> QtGui.QMessageBox.question(wid, 'Message', "Existing app: %r" % app,
>>> QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No)
>>>
>>> This time the message box reacts correctly: it is correctly displayed,
>>> it shows the existing QApplication object and the buttons react.
>>>
>>> A screenshot of the result can be seen here:
>>> http://dl.free.fr/dey2Tzig3
>>>
>>> It seems as if the QLabel I created does not receive any event.
>>> Do you have any idea of how I can fix that? Should I open a bug
>>> concerning this behavior?
>>>
>>> Thanks in advance
>>>
>>> Sébastien Sablé
>>>
>>>
>>>
>>
>> _______________________________________________
>> PySide mailing list
>> PySide@lists.pyside.org
>> http://lists.pyside.org/listinfo/pyside
>>
>>
>
_______________________________________________
PySide mailing list
PySide@lists.pyside.org
http://lists.pyside.org/listinfo/pyside

Reply via email to