2010-08-09 4 views
0

J'ai ma propre application dans QT.Il a un thread graphique principal qui va gérer l'événement à partir des entrées, mais j'ai créé un fil qui sera applicable pour changer les images toutes les 10 secondes (juste comme le diaporama ou l'économiseur d'écran). mais quand j'appelle la fonction setPixmap du fil, cela m'indique qu'il n'est pas prudent d'utiliser Pixmap à partir du thread.Fonction QT thread et setPixmap ne fonctionne pas

quelle est la solution? pourquoi je n'utilise pas setPixmap de thread?

Merci, Neel

Répondre

2

La raison pour laquelle, est parce que cette fonction est pas sûre.

La solution consiste à utiliser un QTimer pour exécuter votre fonction toutes les 10 secondes. QTimer est intégré à la boucle d'événements Qt, vous n'avez donc pas besoin d'un autre thread pour le faire.

1

Je n'ai pas de réponse réelle à cette question, mais je sais que setPixmap() ne devrait être appelée qu'à partir du thread graphique principal. J'ai trouvé ce post de liste de diffusion de quelques années qui pointe également vers docs trolltechs. La lecture de la chose me conduit rapidement à penser que cela a quelque chose à voir avec la manière dont les différentes plates-formes rendent les choses et ainsi de suite.

http://lists.trolltech.com/qt-interest/2008-11/thread00534-0.html

http://doc.trolltech.com/4.4/threads.html#painting-in-threads

+0

Ceci est la cause du problème. QPixmaps doit être géré dans le thread principal. Les widgets ne doivent être manipulés que par le thread principal. – andref

0

Au lieu d'avoir votre fil travailleur appel setPixmap(), il a émettre un signal (quelque chose comme newImagesReady()). Puis, connectez ce signal à l'emplacement update() de votre widget. (Ou créez votre propre emplacement si vous voulez faire plus que rafraîchir le widget).

Cette technique vous permet de traverser les limites de fil.