2010-06-13 2 views
1

J'ai créé le contrôle Qt Tree (et ses nœuds) dans un thread différent de celui du thread principal. Dans le fil principal je veux montrer le menu contextuel pour le noeud cliqué, ainsi je suis connectg les actions dans le menu avec les emplacements appropriés dans le fil principal. La fonction connect renvoie true, mais slot n'est jamais exécuté. Si je dis explicitement dans la fonction connect que c'est Qt :: DirectConnection alors tout fonctionne bien. Pourquoi est-ce ?Qt Direct Connection

I Je crée mon arbre dans le thread principal, tout fonctionne aussi bien, sans avoir à dire que c'est Qt :: DirectConnection.

+0

Vous recevez des erreurs? Peut-être quelque chose comme 'QObject :: connect: Impossible de mettre en file d'attente les arguments de type ...'? – Job

+0

Non Je ne reçois aucune erreur, juste un slot n'est pas entré si je ne spécifie pas Qt :: DirectConnection. Je me demandais juste pourquoi je dois spécifier Qt :: DirectConnection pour que le slot soit entré – user152508

+2

Ceci est juste une supposition: Je pense que vous devriez avoir une boucle d'événement en cours d'exécution dans votre thread pour pouvoir utiliser les connexions en file d'attente. Avez-vous commencé en utilisant 'exec()'? – Job

Répondre

4

Voir la documentation here. Le type de connexion par défaut, Qt :: AutoConnection, est identique à Qt :: DirectConnection si le signal est envoyé à partir du même thread que le logement du récepteur, sinon le comportement est le même que Qt :: QueuedConnection.

Dans le cas où vous créez le widget dans le thread principal, vous obtenez essentiellement le même comportement que lorsque vous spécifiez explicitement Qt :: DirectConnection.

Le comportement de Qt :: QueuedConnection consiste à appeler l'emplacement lorsque cette boucle d'événement threads reprend le contrôle. Pour résoudre votre problème, assurez-vous d'avoir une boucle d'événement dans chaque thread pouvant recevoir des signaux, sauf si vous spécifiez manuellement Qt :: DirectConnection (ce qui, je suppose, signifiera que le slot est appelé depuis le même thread que l'émetteur de signaux - fondamentalement l'équivalent d'un appel de fonction normale).

+0

Ok, je pense que je comprends maintenant. Comme j'émettais le signal du thread principal et que le contrôle de l'arborescence était créé dans un autre thread, j'obtenais QueuedConnection par défaut. Donc, pour obtenir le slot à exécuter dans le thread principal (dans le même thread où j'émets), j'ai dû spécifier Qt :: DirectConnection – user152508