IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

recevoir un signal de la souris

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Par défaut recevoir un signal de la souris
    Bonjour, je m'excuse d'avance pour mes incomprehensions. Pourquoi?! voila je commence la programmation et j'admets bruler beaucoup d'étapes mais je préfère etre motivé par un projet personnel que d'ecrire "hello world!", je n'ai donc pas fait tous les exercices des tutoriaux.

    Heureusement qu'il y a des libs car sinon je ne vois pas comment j'aurais pu faire pour la webcam en c++.

    mais deja j'ai rencontré des problemes pour utiliser plusieurs librairies en meme temps car une seule ne fait pas tout! Voila un petit tutorial a faire quand je maitriserai bien. lol

    voici mon projet : capter via une webcam les films super8 de la famille en modifiant un projecteur.

    pour la capture j'ai utilise la lib openCV. ca c'est fait!
    pour l'interface graphique utilisateur je me suis dit Qt ca a l'air bien... oui pour faire des options a cocher, des boutons, demarrer, stop etc...

    mais je m'eloigne...

    il faut maintenant que je sois prevenu quand le bouton du milieu de ma souris est cliqué (en fait mon installation clique sur le bouton quand l'image est bien dans la fenetre du projecteur)
    n'ayant pas trouvé d'objet tout fait (ou de class toute faite, j'ai encore du mal.) je dois en creer un : le voici...

    souris.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    #ifndef SOURIS_h
    #define SOURIS_h
     
    #include <QThread>
    #include <QEvent>
     
    class Souris : public QThread
    {
      Q_OBJECT
     
      public:
      //constructeur
        Souris(unsigned long milliSec);
      //accesseur
        void setSleep(unsigned long milliSec);
      //destructeur
        virtual ~Souris();
     
      protected:
        void run();
     
      public slots:
        void changerSleepSouris(unsigned long milliSec);
        void resetCompteur
     
      signals:
        void changementEtatBoutonSourisM( bool etatBoutonMilieu, unsigned long m_compteurClicMilieu);
        void clickBoutonMilieu ( unsigned long m_compteurClicMilieu );
     
      private:
        // QMouseEvent objSouris;
        // QEvent * generalEvent;
        unsigned long m_milliSec; // pour eviter les rebonds
        unsigned long m_compteurClicMilieu; // utile pour mon prog. Final
        bool m_etatBoutonMilieu;  // permet de 
     
    };
     
    #endif
    souris.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
     
     
    Souris::Souris() :  milliSec( 1 )
    {
      m_milliSec = milliSec;
     
    }
     
    Souris::~Souris()
    {
     
    }
     
    void Souris::run()
    {
      while(1)
      {
        QMouseEvent * sourisEvent; //version 1
     
        if (event->button() == Qt::NoButton){
     
        }
        else if (event->button() == Qt::MidButton){
     
        }
     
        else {
          // "autre!!!\n"
        }
     
        QEvent * generalEvent; //version 1
     
        if (generalEvent->type() == Qt::NoButton){
     
        }
        else if (generalEvent->type() == Qt::MidButton){
     
        }
     
        else {
          // "autre!!!\n"
        }
      }
      this::msleep ( m_milliSec )
    }
     
    void Souris::setSleep(unsigned long milliSec)
    {
      m_milliSec = milliSec;
    }
     
    void Souris::changerSleepSouris(unsigned long milliSec)
    {
      m_milliSec = milliSec;
    }
    j'ai pensé a deux versions dans le "run()" la seconde me semble plus proche du signal et semble pouvoir capter le bouton meme a l'exterieur de la fenetre Qt ce qui est aussi important.

    je pense que c'est assez brouillon pour un vrai codeur mais si une ame charitable pouvait m'aider?

  2. #2
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Par défaut
    Pourquoi ne pas gerer une evenement comme moussePressEvent plutot que ton thread ?
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Par défaut
    il me semble que moussePressEvent ne me permet pas d envoyer un signal a mon slot qui va prendre l'image.

    de plus moussePressEvent est associer a un widget donc ne detectera t il pas l'action que si la souris est dans zone de la fenetre?

    il me semble que mon thread me permet le test puis en fonction du resultat : cree le signal. mais je ne suis meme pas sure que ma class fonctionne je n'ai pas pu la tester. ( il manque qque infos dans le run de toute facon ).

    j'ai des problemes de compilation avec Qt et code::bloc ou faire mon make avec d'autre libraries... mais c un autre probleme.

  4. #4
    Membre éclairé Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Par défaut
    Citation Envoyé par espritlune Voir le message
    il me semble que moussePressEvent ne me permet pas d envoyer un signal a mon slot qui va prendre l'image.
    Tu peux envoyer un signal par un simple "emit" où tu le souhaites.

    j'ai des problemes de compilation avec Qt et code::bloc ou faire mon make avec d'autre libraries... mais c un autre probleme.
    Pour cela, suffit de modifer le .pro pour donner les chemins vers tes libs par "LIBS += ", tu trouveras de la doc dessus

  5. #5
    Membre expérimenté Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Par défaut
    de plus moussePressEvent est associer a un widget donc ne detectera t il pas l'action que si la souris est dans zone de la fenetre?
    Une fenêtre est un widget

    emit monSignal(unparametre); fonctionne !

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Par défaut
    Merci pour vos réponses rapides.
    Pour cela, suffit de modifier le .pro pour donner les chemins vers tes libs par "LIBS += ", tu trouveras de la doc dessus
    Et ca en moins!!! cool!


    Tu peux envoyer un signal par un simple "emit" où tu le souhaites.
    Bien sure! Je ne l'avais pas écris dans mon run() mais c'est vrai qu'il manque mon emit dans les conditions "if".


    La question que je me posait suite a l'intervention de superjaja :
    Pourquoi ne pas gérer une événement comme moussePressEvent plutôt que ton thread ?
    je ne suis pas sure de bien comprendre son fonctionnement :

    void QWidget::mousePressEvent ( QMouseEvent * event )

    Faut il que je redéfinisse cette fonction en y insérant mes conditions et mon emit?
    sera t elle "exécuté" dès qu'un évènement souris se passe? (sans être dans une boucle)
    un petit indice pour redéfinir cette fonction dans un widget : dois-je en créé un ou puis-je l'intégrer à ma fenêtre principale?

    Une fenêtre est un widget
    J'avais plus ou moins compris mais du coup si je clic à l'extérieur de la fenêtre, mon clic sera t il pris en compte et donc mon signal généré?

  7. #7
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Par défaut
    Citation Envoyé par espritlune Voir le message
    Faut il que je redéfinisse cette fonction en y insérant mes conditions et mon emit?
    Oui, c'est le principe

    Citation Envoyé par espritlune Voir le message
    sera t elle "exécuté" dès qu'un évènement souris se passe? (sans être dans une boucle)
    Oui tout a fait.

    Citation Envoyé par espritlune Voir le message
    J'avais plus ou moins compris mais du coup si je clic à l'extérieur de la fenêtre, mon clic sera t il pris en compte et donc mon signal généré?
    Normalement non.

    Bon courage pour la suite. Essaie de te lancer et utilise un debugger avec des points d'arrets tu comprendras mieux ton code et le fonctionnement de Qt.
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Citation:
    Envoyé par espritlune
    J'avais plus ou moins compris mais du coup si je clic à l'extérieur de la fenêtre, mon clic sera t il pris en compte et donc mon signal généré?
    Normalement non.
    Et je dirais même heureusement. Si toutes les applications lancées sur une machine recevait un event de souris à chaque fois que celle ci est utilisée, imagine le bazar !

    Tu peux l'intégrer à ta fenêtre principale. En fait, cette fonction existe deja dans QWidget, dont ta fenetre principale hérite. Il suffit de la redéfinir pour ta classe "FenetrePrincipale".

    G.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Par défaut
    Super merci Superjaja.
    réponses claires... limpide... top!

    un peu déçu de ne pas pouvoir capter le signal souris hors fenêtre. Si quelqu'un a une idée je suis preneur! heuuu... sans passer par window.h bien sur!!! car avec cette lib on peut connaitre la position de bouton où qu'il soit et quelque soit les fenêtres actives.

    bon je vais faire une fenêtre qui prendra tout l'écran, voir repositionner le cursor a chaque fois pour éviter qu'il glisse à l'extérieur de la fenêtre.

    Merci aussi a Gulish.

    pour le débugger c'est vrai j'en ai encore jamais utilisé, je ne sais pas m'en servir. déjà je galère avec code::block et Qt. bon je me pencherai sur le problème un jour. encore des tutos à lire... lol... Merci à toute la comunauté des codeurs(euses) fous(folles)!

  10. #10
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Par défaut
    Juste pour info. J'ai pas tres bien compris pourquoi tu as besoins de la position de la souris quand le curseur est en dehors de ton application ? Pourquoi as tu besoins de ça ?
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Par défaut
    En fait je n'ai pas besoin de la position de la souris mais que de l'information clic à tous moments.
    J'ai démonté une souris pour utiliser le contact du bouton du milieu.
    je l'utilise dans un projecteur pour définir quand prendre l'image en photo.

    Au départ je voulais avoir un signal complètement indépendant, créé un objet «*souris*» qui donne le signal à un mon objet scan(en C++ / lib : openCV).
    Je voulais une petite fenêtre Qt pour voir des statistiques, un bouton start/stop, un champ nom de fichier, etc.

    Du coup je me dis utilisons la lib Qt pour tester l'état du bouton. Et voilà ou j'en suis :

    Tu me dis que si la souris n'est pas dans le fenêtre je n'aurai pas l'info du clic, donc je vais faire en sorte que la souris soit toujours dans la fenêtre.

    Bon j'avoue que j'ai les yeux plus gros que le cerveau... lol. Je débute en programmation et voilà mon troisième programme. Mais quand on est motivé... On apprends plus vite.

  12. #12
    Membre éclairé Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Par défaut
    Citation Envoyé par espritlune Voir le message
    J'ai démonté une souris pour utiliser le contact du bouton du milieu.
    Mc Giver est sur le forum de Qt, classe !

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Par défaut
    si tu veux tout savoir j'ai même voulu utiliser le port //, il y une lib pour ca qui contourne les blocages XP. mais je suis aussi doué en prog qu'en électronique alors ne pouvant pas tout affronter de front j'ai privilégié la prog et pris ce qui existe comme périphérique lol. la souris.
    J'utilise une loupe webcam pour scanner image par image les 8mm de mon enfance

    Bonne nuit la marmotte enfin peut etre plus un Écureuil... non?

  14. #14
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Théoriquement, je pense que c'est possible de récupérer tous les signaux souris, si tu gères ta souris comme une connexion série quelconque, ou plus bas niveau dans ton OS, mais là je peux pas t'aider.

    Sinon, tu pouvais pas utiliser un périphérique bluetooth ou truc du genre ? C'est souvent bien plus facile à "grabber" comme signal, et là ça aurait pu marcher tout le temps.

    Sinon, tu peux peut être faire un truc avec QDesktopWidget (aucune confirmation). La fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QWidget * screen ( int screen = -1 )
    te retourne un widget représentant l'écran. Tu peux redéfinir cette fonction afin qu'elle te retourne un widget personnalisé dans lequel tu auras redéfini la commande mousePressEvent().

    C'est un peu plus compliqué, mais c'est jouable je pense.

    G.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Par défaut
    Des nouvelles du front!

    j'utilise
    void QWidget::mousePressEvent ( QMouseEvent * event )
    pour avoir un signal sur le bouton de la souris, cela marche parfaitement!!!

    je compile du Qt avec du openCV tout fonctionne!
    Génial merci à tous!

    Arrrggg.... problème! à la main ça marche, dans le projecteurs dès qu'il tourne le bouton est toujours enfoncé! J'en déduit que le test est trop lent!!! pas possible de cliquer 24 fois par sec... ni même 18... va falloir que je réduise la vitesse. Ou que je trouve une autre solution.

  16. #16
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Par défaut
    Peux-tu nous montrer le code de ta fonction mousePressEvent() ?
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Par défaut
    Oui bien sure...
    Désolé je n'ai pas vu qu'il y avait une deuxieme page.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    void FenP1::mousePressEvent ( QMouseEvent * event )
    {
      if (compteurClicM == 0) chronometre.restart();
     
      if (event->button() == Qt::MidButton){
     
        if ( pushButtonScanOnOff->text() == "Stop Scan" ){
          projo.scan();
        }
     
        compteurClicM ++;
        if (chronometre.elapsed() > 1000){
          compteurClicSec = compteurClicM / ( chronometre.elapsed() - 1000 );
        }
        affichageStat();
      }
    }
    voici juste la fonction qui dans mon ma class :
    class FenP1 : public QWidget, private Ui::F8mm

  18. #18
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Par défaut
    Si le temps est trop long c'est que surement les fonctions Scan() ou affiche Start() durent trop longtemps. Il faudrait peut etre le code de ses fonctions ou alors que tu nous dises laquelle dure vraiment longtemps. Apres on trouvera surement un moyen de controurner le problème.
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Par défaut
    je vais faire quelques tests avec et sans les fonctions.
    par un signal et avec un appel direct des fonctions et je vous donnerai tous les résultats. j'ai un peu moins de temps en ce moment mais dès la semaine prochaine j'en aurai plus.

  20. #20
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Euh, est ce que je divague, ou alors en fait le clic souris est fait par "un mécanisme" et non par un homme ? Quand tu dis "24 clics par seconde" ça ne marche pas, est ce que ton mécanisme enfonce et relache 24 fois la souris ?

    J'ai plutot l'impression que tu laisse enfoncé le clic pour filmer, non ?

    Si c'est le cas, tu n'as qu'un seul clic émis au moment ou tu enfonces et c'est tout. Pour garder ton mécanisme, tu devrais "démarrer la capture sur le mousePressEvent" et l'arrêter sur le "mouseReleaseEvent".

    Mais ça se trouve je divague complement ...

    G.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 6
    Dernier message: 24/02/2015, 09h13
  2. Réponses: 1
    Dernier message: 08/03/2009, 18h55
  3. Réponses: 4
    Dernier message: 28/12/2008, 22h46
  4. Signaler le survol de la souris sur un élément de menu
    Par hellspawn_ludo dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 05/05/2008, 16h56
  5. Comment simuler un signal souris
    Par shiin dans le forum Linux
    Réponses: 1
    Dernier message: 12/09/2006, 10h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo