[Qt-interest] QGraphicsView QThread

Bas Terwijn B.Terwijn at uva.nl
Tue Mar 31 18:09:39 CEST 2009


hi Fred, Alexis

First of all, thanks for your interest.

I tried the solution offered by Alexis. It seems to be stable. Instead 
of calling the QGraphicsItem:setPos() in the QThread after each change, 
i now send for each item a signal to a newly created slot of each item 
that then calls setPose() which is now done in the main thread.

However, in my old test I created the objects derived from QGraphicsItem 
in the main thread, if I now create items and connect their signal in 
the QThread it is again unstable.

To give some background, what i want is the following. Say i am 
developing some simulation program. For debugging purposes I would like 
to visualize and manually manipulate it. For this I thought I use Qt. 
But in the end I also want to run my simulation without any Qt 
libraries. So I would like to be able to build the simulator both with 
and without Qt, use Qt as an add-on so to say. However, Qt imposes 
architectural constraints onto my simulation program. As Qt demands 
complete control over the main thread, I have to run the simulator in a 
QThread when compiling with Qt. Creating and changing the elements to be 
visualized (object derived from QGraphicsItem) in this thread is now my 
main problem. My simulation program should not be aware if it is running 
with or without QT so i can use a simple macro that indicates the use of 
Qt or not.

So here is my refined question:

  How can I *create* and update (derived) QGraphicsItems in a QThread 
that are to be visualized in a QGraphicsView in the main thread?

kind regards,
Bas Terwijn
 

Alexis Ménard wrote:
> On Monday 30 March 2009 18:03:27 Bas Terwijn wrote:
> > hi all,
> >
> > I am trying for some time to use QGraphicsView in a multi-threaded
> > application where in the main thread I create an QGraphicsView object
> > and run the event loop while in a seperate QThread I create and and
> > change many QGraphicsItems that are to be visualized in the main thread.
> > For thread safety I use a mutex to synchronize the (overloaded)
> > QGraphicsView::update() method and all changes to the QGraphicsItems.
> >
> > My approach doesn't work. I find that the QGraphicsView doesn't update,
> > even when I send signals which I think should start the
> > QGraphicsView::updateScene() from the main thread. I also experience
> > core dumps.
> >
> > Did anybody find a way to use QGraphicsView to visualize QGraphicsItems
> > that are changed by a seperate QThread?
> >
> > Thank you for your time,
> > Bas Terwijn
>
>
> It won't work...QGraphicsView framework is not thread safe. So you 
> can't call any functions from your separate thread, it might crash. 
> But what is the point to do the changes into your thread, can't your 
> thread emit a signal when it finish to compute and then the main 
> thread change the item itself?
>
>
> >
> > _______________________________________________
> > Qt-interest mailing list
> > Qt-interest at trolltech.com
> > http://lists.trolltech.com/mailman/listinfo/qt-interest
>
> -- 
>
> Alexis Ménard
> Software Engineer, Widgets Team 1
> Qt Software, Nokia Norge AS, Sandakerveien 116, 0484 Oslo, Norway
> ------------------------------------------------------------------------
>
> _______________________________________________
> Qt-interest mailing list
> Qt-interest at trolltech.com
> http://lists.trolltech.com/mailman/listinfo/qt-interest
>   

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.qt-project.org/pipermail/qt-interest-old/attachments/20090331/6011b62e/attachment.html 


More information about the Qt-interest-old mailing list