Problème avec Qt4 - C++ - Programmation
Marsh Posté le 17-02-2008 à 21:18:09
Salut,
Un slot ne peut être connecté qu'à un signal ayant la même signature, voire moins de paramètres. Mais jamais un slot ne peut avoir plus de paramètres que le signal; où irait-il en chercher la valeur sinon?
Pour résoudre ton problème, il faut 2 choses:
Marsh Posté le 17-02-2008 à 22:31:09
Tout d'abord merci pour ta réponse aussi rapide,
ensuite j'aurais besoin de quelques éclaircissements sur tes propos:
Citation :
|
Encore merci pour ta réponse et j'espère ne pas faire trop le boulet !!!
Marsh Posté le 17-02-2008 à 22:45:20
Oula, les signaux ont un corps, mais ce n'est pas toi qui l'écris
Va faire quelque tutos d'abord => http://doc.trolltech.com/4.3/tutorial.html
Pour le 2nd point, surcharger la méthode accept() te permet justement de rajouter ce que tu veux. Donc oui, tu le laisses associer au signal clicked() du bouton OK; lors de ce clic, il va se passer ça:
0. émission du signal clicked de QPushButton
1. Appel de CreatePlayerDialog::accept()
2. (ton code) émission du signal newPlayer("son nom" )
3. (ton code) appel de QDialog::accept()
Marsh Posté le 17-02-2008 à 23:29:42
Si je résume ce que tu viens de me dire :
-quand l'utilisateur va cliquer sur le bouton ça va appeler un slot accept() que j'aurais redéfinis dans la classe CreatePlayerDialog.
-ensuite je vais créer mon joueur avec "son nom" dans une fonction. Cette fonction va émettre le signal qui va appeler le slot accept() de la classe QDialog.
Mais comment je fais pour surcharger le slot accept() puisque je sait juste que la méthode accept() renvoi un entier (et encore je suis plus trop sur maintenant que j'y écrit!!)??
Et ensuite je ne comprend pas bien comment ceci va me permettre de récupérer le nom dans ma fenêtre principale.
Je suis désolés mais je ne comprend pas très bien les tuto que tu m'a filé puisqu'ils sont en anglais et que l'anglais et moi sa fait 3 !!!!
Encore merci pour tes réponses je pense que pour ce soir je vais arrêter le Qt je m'y remettrais demain parce que la ça me prend un peu la tête!!!
Bonne nuit à tout le monde!!
Marsh Posté le 18-02-2008 à 01:22:02
Je peux pas faire grand chose de plus pour t'aider. Bosse les tutos; de toute façon sans anglais tu feras pas grand chose en prog.
Parce que là tu n'as visiblement rien compris à la façon dont Qt fonctionne, et c'est pas avec un post de forum que je vais t'aider (te filer le code ne compte pas comme une façon d'aider si tu ne le comprends pas).
Marsh Posté le 18-02-2008 à 11:42:39
Oui tu as raison et je ne recherche pas le code tout fait je pense que je vais me débrouiller tu m'a bien avancé.
Je te remercie.
Bonne journée.
Marsh Posté le 18-02-2008 à 20:50:21
Bonsoir à vous tous,
J'aurai encore besoin de votre aide.
J'ai réussi à réparer le problème de signal/slots que je vous ai exposé précédemment mais maintenant il passe deux fois dans le slot pour un seul signal. Je ne vois pas quel est le problème mais je pense que c'est un petit truc que j'aurais pas vu.
Tenez moi au courant si vous avez besoin du code.
Merci d'avance
Marsh Posté le 19-02-2008 à 01:24:55
ReplyMarsh Posté le 19-02-2008 à 10:58:53
IrmatDen a écrit : Tu as avoir fait 2 connections à ce signal. Une connexion = un appel. |
Voici mon slot :
Code :
|
Et voici mon seul appel :
Code :
|
J'ai pas l'impression d'avoir fait deux appel. C'est pour ça que je ne comprend pas.
Merci pour ta réponse et désolé de pas avoir répondu plus tôt.
Marsh Posté le 19-02-2008 à 12:47:58
Le connect "doit" se faire dans la classe mère; en effet CreateTeamDialog n'aura pas forcément toujours le parent disposant de ce slot. Si c'est mainwindow qui s'occupe de la connection, tu rends ta boîte de dialogue plus indépendante de mainwindow.
Quel est le constructeur de MainWindow? C'est quoi le code de on_okButton_clicked?
Marsh Posté le 19-02-2008 à 13:14:34
Désolés là j'ai pas le temps de te mettre mon code j'ai un rendez vous mais je rentre dans une heure je te mettrais tous les codes nécessaires
Marsh Posté le 19-02-2008 à 16:05:25
IrmatDen a écrit : Quel est le constructeur de MainWindow? C'est quoi le code de on_okButton_clicked? |
Constructeur de MainWindow :
Code :
|
code de on_okButton_clicked :
Code :
|
petite modification car tout à l'heure j'ai mis le constructeur de CreateTeamDialog alors que ce n'est pas la fenêtre concerné mais plutôt CreatePlayerDialog :
Code :
|
Excuse moi pour le temps de réponse et pour l'erreur du post précédent.
Marsh Posté le 19-02-2008 à 16:07:04
Je vais essayer de mettre la connect dans le MainWindow comme tu me l'as dit je te dirais si ça a fonctionné.
Marsh Posté le 19-02-2008 à 16:07:26
Bizarre, y'a rien qui génère un double appel du slot là (Par contre y'a toujours l'erreur de connecter le signal au mauvais endroit)
Tu le vois à quoi que le slot est appelé en double?
Marsh Posté le 19-02-2008 à 16:12:05
Je vois que le slot est appelé en double car j'affiche le nom du joueur créé dans un QTreeWidget et qu'il en affiche 2 quand j'en créé 1.
Et j'ai testé en rajoutant un QMessageBox dans le slot on_okBouton_clicked et en fait celui la est déjà appelé 2 fois....
Est-ce que ce serait possible que le problème vienne du fait que j'ai créé la fenetre creatPlayerDialog sous QTDesigner???
Marsh Posté le 19-02-2008 à 16:14:01
Autre chose je vois pas comment je peux appeler le signal dans MainWindow vu que le signal est fait lorsque l'on appui sur le bouton ok de ma fenêtre createPlayerDialog
Marsh Posté le 19-02-2008 à 16:15:13
Au fait je tiens à le re-préciser je ne veux pas le code tout fait je tiens absolument à comprendre. Je trouve cette bibliothèque très intéressante donc je veux comprendre!!!!
Marsh Posté le 19-02-2008 à 16:21:55
fardke1 a écrit : Est-ce que ce serait possible que le problème vienne du fait que j'ai créé la fenetre creatPlayerDialog sous QTDesigner??? |
Bon hint
T'aurais pas fait une connection du signal clicked() vers le bouton ok accept() dans le designer par hasard? Si c'est le cas, setupUi() s'en occupe déjà, d'où le double appel.
fardke1 a écrit : Autre chose je vois pas comment je peux appeler le signal dans MainWindow vu que le signal est fait lorsque l'on appui sur le bouton ok de ma fenêtre createPlayerDialog |
Tu n'appelles pas le signal, tu y connectes un slot.
fardke1 a écrit : Au fait je tiens à le re-préciser je ne veux pas le code tout fait je tiens absolument à comprendre. Je trouve cette bibliothèque très intéressante donc je veux comprendre!!!! |
T'inquiétes, t'auras pas ça de moi en général
Marsh Posté le 19-02-2008 à 16:31:19
C'est bon sa venait du fait que je l'avais fait sous QtDesigner.
Je viens de le faire à la main et c'est bon sa ne le fait qu'une seule fois.
Mais je vois pas bien pourquoi je ne peux pas le faire avec QtDesigner puisque je n'ai pas connecter mes bouton à accept ou tout autre slot dans QtDesigner....
Marsh Posté le 19-02-2008 à 20:35:48
Tu peux aussi le faire sous le designer mais il ne faut à ce moment pas le rajouter dans ton propre code. Le simple fait que ton slot était appelé 2 fois prouve bien que la connection dans le designer est fonctionnelle
Marsh Posté le 20-02-2008 à 19:40:17
Bonjour à vous tous,
Est ce que quelqu'un saurait quelle est la fonction pour supprimer un QTreeWidgetItem sous QT 4.1 parce que j'ai vu removeItemWidgetmais à priori elle n'est compatible qu'avec QT4.2 (ou QT4.3 je me souviens plus)
Merci d'avance
Marsh Posté le 20-02-2008 à 19:53:11
Heu, je sais pas où tu as vu cette fonction
Si mes souvenirs sont bons, un simple delete sur un QTreeWidgetItem* notifie la vue de sa suppression et zou, il est plus là. Si tu veux le déplacer par contre, il faut te servir des méthode QTreeWidget::takeTopLevelItem* pour les item racines, et QTreeWidgetItem::take* pour les items fils d'autres items.
Edit: par contre tu devrias créer un nouveau fil pour de nouvelles questions, c'est plus facile à chercher par la suite.
Marsh Posté le 17-02-2008 à 20:58:21
Bonjour à vous tous,
J'ai un problème avec Qt4. Je dois créer l'interface graphique d'un logiciel d'acquisition et de visualisation de statistiques sportives.J'ai donc créé une fenêtre principale (la classe MainWindow) et une fenêtre de dialogue pour créer un joueur (la classe CreatePlayerDialog). J'ai créé la fenêtre de dialogue sous qt designer et j'ai codé dans le constructeur de createPlayerDialog les slots émit par le clique sur le bouton OK de cette fenêtre. Il y a deux slots pour ce bouton:
-accept().
-addElem(nom).
Mon problème réside dans le slot addElem(). C'est un slot qui s'applique sur le parent de la boite de dialogue donc sur ma fenêtre principale(j'espère que vous me suivez jusqu'à maintenant!) et le problème est donc que ce slot ne s'exécute pas.
Je suis débutant en Qt et je n'est trouver que des tutoriaux en anglais donc je galère un peu à comprendre. Je ne vois pas d'où peux venir le problème.
voilà l'appel des slots pour le bouton OK de la fenêtre de dialogue de création du joueur :
Et voilà le code du slot addElem défini dans ma classe MainWindow :
j'ai déclaré ce slot en "private slot :" mais j'ai aussi essayé de le déclarer en "public slot :" mais ça ne marche pas mieux.
J'espère que vous avez compris mon problème et que vous pourrez m'aider. Si une explication n'était pas assez claire n'hésitait pas a me contacter sur le forum j'ai la possibilité d'y aller pendant toute la semaine après je n'aurais plus le web.
Merci d'avance.