2009-11-20 6 views
2

Dans Qt, un objet appartient au thread sur lequel il a été créé. Nous devons accéder aux contrôles créés dans le thread principal à partir du thread d'arrière-plan. Cependant, dès que nous nous référons à l'objet, l'application passe en état de blocage. S'il vous plaît laissez-moi savoir comment accéder et modifier les contrôles dans le thread différent qui n'a pas créé les contrôles.Accès au widget Qt à partir d'un thread différent

Merci d'avance.

Répondre

0

Essayez de transmettre le pointeur de classe au constructeur.

1

Vous pouvez déclencher un signal à partir du thread d'arrière-plan à exécuter dans un emplacement sur le thread principal. Si je me souviens bien, ceci est fait automatiquement si vous spécifiez Qt :: AutoConnection dans l'appel de connexion.

1

Vous aurez des problèmes pour accéder à la plupart des portions de code spécifiques à Qt à partir d'un thread pour un objet appartenant à un thread différent. Le moyen le plus simple de contourner ce problème consiste à utiliser des signaux et des emplacements, comme suggéré par OregonGhost. Si cela ne suffit pas, vous devriez regarder le code de l'événement. Vous pouvez envoyer un événement à l'objet A qui contient un pointeur vers l'objet B (qui doit recevoir la réponse), puis dans la fonction customEvent() de l'objet A, créer un événement pour la réponse et l'enregistrer dans l'objet B. La fonction cusotmEvent() est exécutez toujours dans le thread qui possède l'objet donné, de sorte que vous pouvez interagir avec le code fourni par Qt autant que vous le souhaitez. La publication d'événements sur un autre objet est également répertoriée comme thread-safe, quel que soit le thread propriétaire de l'objet récepteur.

3

Eh bien, je ne suis pas d'accord. Qt dit clairement que vous ne pouvez pas accéder à un gui à partir d'un autre thread que le principal. Il y a deux façons d'atteindre ce dont vous avez besoin.

  1. faire Qt :: QueuedConnection entre votre fils et la fenêtre principale à savoir principale fente de fenêtre updateProgressBar(int), signal de fil updateProgressBar(int). Vous pouvez également connecter vos signaux de threads de travail directement aux widgets que vous souhaitez mettre à jour
  2. Définissez vos propres événements personnalisés (la valeur de votre type d'événement personnalisé doit être >= QEvent::User et <= QEvent::MaxUser), réimplémentez customEvent dans la fenêtre principale et gérez correctement ces événements. Passez les événements à votre fenêtre principale (vous devez alors pointer vers votre objet fenêtre principale) par QCoreApplication::postEvent(mainWindow, yourCustomEvent)
Questions connexes