probleme de slot avec qt et de QTimer

probleme de slot avec qt et de QTimer - C++ - Programmation

Marsh Posté le 05-05-2007 à 11:50:06    

Bonjour, je programme un bomberman avec c++ et la bibliotheque qt, je voudrais utiliser la fonction singleShot de Qt mais je pense avoir un probleme avec le SLOT comment définir la fonction que je veux utiliser comme étant un slot? pour l'instant j'ai mis dans mon .h : protected slots: ma fonction(int a, int b) et ensuite dans mon .cpp au moment ou j'ai besoin de cette fonction j'ai fait : QTimer::singleSlot(1000,this,SLOT(mafonction(a,b))) quand je lance mon programme, ma fonction ne se lance jamais. Est ce que quelqu'un serait m'aider? merci d'avance
Adeline

Reply

Marsh Posté le 05-05-2007 à 11:50:06   

Reply

Marsh Posté le 05-05-2007 à 13:42:48    

Salut,
Tu ne peux pas passer des paramètres par un slot. La bonne signature à passer est ma_fonction(int,int) au lieu de ma_fonction(a,b).
Ensuite, ça ne fonctionnera pas car le slot doit avoir la même signature que le signal auquel il est connecté. Et comme QTimer::singleShot masque un connect sur un signal timeout(), ta fonction ne peut pas être connectée.

Reply

Marsh Posté le 05-05-2007 à 14:41:06    

oki mais alors comment je peux faire pour que ma fonction qui a besoin de parametres se déroule apres x seconde?

Reply

Marsh Posté le 05-05-2007 à 15:29:22    

Faire en sorte que ta fonction n'ait pas besoin de paramètre? Ou plutôt, faire en sorte que ta fonction qui ait besoin de paramètre soit appelé par le slot qui lui n'en aura pas besoin.

Reply

Marsh Posté le 06-05-2007 à 10:13:54    

coucou, je me suis débrouillée pour que ma fonction slot n'ai pas de parametre et apelle une autre fonction mais ca ne marche quand meme pas :(  
 
j'ai fait :  
#ifndef _MAP_H_
#define _MAP_H_
 
#include <QApplication>
#include <QPainter>
#include <QEvent>
#include <QKeyEvent>
#include <QWidget>
#include <QTimer>
 
class Map : public QWidget
    {
    public:
        // constructeur    
      Map(QWidget *parent = 0);
    public slots :
           
    void timerEvent();
 
ca j'ai mis dans mon.h et ensuite dans mon .cpp j'ai simplement ecrit : QTimer::singleshot(1000,this,SLOT(timerevent()));
et il n'apelle jamais ma fonction timer event est ce que tu sais pq?

Reply

Marsh Posté le 06-05-2007 à 13:10:56    

Déjà, ça risque pas de compiler avec cette ligne, c'est singleShot, pas singleshot.
Et il y a une seconde erreur qui est exactement la même sur la même ligne qui fait que ton slot n'est pas appellé puisqu'inconnu.

Reply

Marsh Posté le 06-05-2007 à 14:22:01    

c'est fautes la ne sont pas dans mon programme j'ai recopié ici en oubliant les majusculesd et ca ne fonctionne quand meme pas est ce que la définition de mon slot dans le .h ezst suffisante?

Reply

Marsh Posté le 06-05-2007 à 14:34:38    

Normalement oui... Ouvre ton fichier projet.pro, et ajoute la ligne suivante:

Code :
  1. CONFIG += console


Le programme s'ouvrira avec une console, et affichera un message d'erreur si le connect n'est pas bon. Le message s'affichera au moment du connect, donc reproduis l'utilisation que tu veux en faire.
 
Ensuite, colle le message ici, on y verra plus clair.

Reply

Marsh Posté le 06-05-2007 à 14:39:44    

je ne vois pas bien ou taper cette ligne de code (hyper débutante) quand je la met dans le main il dit ne pas connaitre CONFIG et dans le constructeur de ma classe il dit la meme chose.

Reply

Marsh Posté le 06-05-2007 à 15:03:29    

J'ai dit dans le fichier projet (tu dois bien avoir un fichier.pro quelque part?). Ce n'est effectivement pas une instruction valide dans un fichier c++ :P

Reply

Marsh Posté le 06-05-2007 à 15:03:29   

Reply

Marsh Posté le 06-05-2007 à 15:39:37    

nope pas de fichier pro :D j'ai des trucs .dev

Reply

Marsh Posté le 06-05-2007 à 16:00:28    

Tu utilise quel IDE???

Reply

Marsh Posté le 06-05-2007 à 16:04:17    

je ne sais pas ce qu'est un IDE mais j'utilise dev c++ c'est ca? sur windows

Reply

Marsh Posté le 06-05-2007 à 16:45:49    

Aïe, je suis pas sûr de pouvoir t'aider plus. Tu as suivi un tuto particulier? Y'a-t-il un champ dans la configuration de ton projet où tu peux choisir entre un mode console et un mode fenêtre?

Reply

Marsh Posté le 06-05-2007 à 17:02:29    

non je n'ai pas le choix de ma console :/

Reply

Marsh Posté le 06-05-2007 à 17:07:34    

Bon... alors, on rentre dans les expériences alors... ouvre une console (démarrer > exécuter > cmd), puis va dans le dossier où il y a ton exécutable, et lance le avec cette commande:
tonfichierexe > output.txt
 
Ensuite, tu utilises ton appli jusqu'au moment où le slot devrait être appellé, puis tu quittes. Ensuite, si tout va bien, tu devrais avoir un fichier output.txt qui se crée dans le même répertoire. S'il contient quelque chose, post le ici.
 
Dans le cas contraire, post tout le code nécessaire à la compréhension du problème:
> création du timer
> fonction compléte où le connect est fait
> contenu du slot
> contenu de la fonction appellée par le slot

Reply

Marsh Posté le 06-05-2007 à 17:40:17    

je n'ai pas fait de fonction connect c'est quoi+?

Reply

Marsh Posté le 06-05-2007 à 17:47:32    

Au temps pour moi, je parlais de ça: QTimer::singleshot(1000,this,SLOT(timerevent()));

Reply

Marsh Posté le 07-05-2007 à 10:45:53    

Voci mon main :
#include "Map.h"
#include <iostream>
 
using namespace std;
 
int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        Map carte;
        carte.show();
        return app.exec();
   
    }
 
 
voici mon Map.h :
#ifndef _MAP_H_
#define _MAP_H_
 
#include <QApplication>
#include <QPainter>
#include <QEvent>
#include <QKeyEvent>
#include <QWidget>
#include "joueur.h"
#include <QTimer>
#include "file.h"
#include <queue>
 
 
class Map : public QWidget
    {
    public:
 
      Map(QWidget *parent = 0);
           
      void timerEvent();
             
 protected:  
             
quelques fonctions  
         
 private:
 
         };
#endif
 
ensuite dans une fonction je mon.cpp j'apelle :
QTimer::singleShot(1000,this,SLOT(timerEvent()));

Reply

Marsh Posté le 07-05-2007 à 14:59:11    

Alors, est-ce que tu peux faire comme je t'ai demandé et nous donner tout ce qui est utile? Là, je ne vois pas la fonction entière où tu appelles le singleShot...
 
Par contre je vois une chose qui a changé: void timerEvent() n'est plus déclaré comme slot, mais comme fonction normale. Ensuite, il n'y a pas la macro Q_OBJECT dans Map (obligatoire pour, entre autres, les signaux/slots).
 
Je te conseille d'aller réviser un peu, j'ai l'impression que tu n'as pas compris grand chose à ce système.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed