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

Qt Discussion :

De QPointF au QWidget correspondant


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Par défaut De QPointF au QWidget correspondant
    Bonjour,

    Je m'amuse à développer un logiciel qui permet de simuler une batterie et d'autres instruments sur écran tactile. Effectivement, j'ai acheté une Tablet PC il y a peu de temps et j'ai pensé que ca serait sympa de taper sur l'écran pour jouer des sons, mais j'ai rien trouvé qui me plaisait sur le net.

    Alors j'ai développé ca et je l'ai mis sur la toile,
    voila si vous voulez le télécharger : Touch Drums v1.4



    Bien sûre, ya pas mal d'évolution à faire, et la première à laquelle je pense c'est de pouvoir jouer deux (ou plus) de boutons à la fois.
    Je ne sais pas si la technologie le permet (bon, si ca s'appelle multi-touch, c'est certainement que ca le permet, mais je suis bien plus dubitatif sur Qt4

    - J'ai commencé à chercher dans QTouchEvent: widget() ne retourne qu'un seul widget, celui où se produit l'action principale ; touchPoints () semble etre intéressent, il retourne une liste de TouchPoint
    - rien de spéciale dans TouchPoint; mais pos() retourne in QPointF, donc je peux avoir une liste de QPointF
    - je ne vois rien non plus dans QPointF

    alors j'aimerais savoir si vous avez une solution pour trouver quel est le widget sous le QPointF

    sinon avez vous une autre solution ? (je pense à fixer la taille de tous mes widget et mapper la poisition des boutons)

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Par défaut
    Bonjour,

    Peut-être que la fonction widgetAt de QApplication pourrait vous intéresser ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Petit exemple d'utilisation avec un petit cast derrière pour le fun :
    QWidget *_widget = qApp->widgetAt(point);
    QTextEdit *_textEdit = qobject_cast<QTextEdit *>(_widget);
    if (_textEdit) // Notre widget est un textEdit
        doSomething(_textEdit);
    Bonne continuation,
    Amnell.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Par défaut
    J'ai cherché du coté de widgetAt, mais je suis encore bloqué

    Donc je réexplique mon problème, j'ai un QDialog dans lequels j'ai plusieurs bouttons sur lequels je veux appuyer simultanéments avec mon écran touchscreen pour qu'ils produisent une action en même temps.

    Voici mon code (j'ai rajouté l'attribueQt::WA_TransparentForMouseEvents sur les boutons pour que ce soit le Qdialog qui recoit les evenements touch)

    pour commencer, la commande principale :

    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
     
       QApplication *app = new QApplication(argc, argv);
     
       QSpecialDialog *tdrumsWindow = new QSpecialDialog(app);
     
       QVBoxLayout *mainLayout = new QVBoxLayout(tdrumsWindow);
     
       QHBoxLayout *XLayout = new QHBoxLayout();
     
       QSpecialButton *buttonX01 = new QSpecialButton(...);
       QSpecialButton *buttonX02 = new QSpecialButton(...);
     
        XLayout -> addWidget(buttonX01 ,0,Qt::AlignBottom);
        XLayout -> addWidget(buttonX02 ,0,Qt::AlignBottom);
     
       mainLayout -> addLayout(XLayout);
       tdrumsWindow -> setLayout(mainLayout);
        tdrumsWindow->show();
        return app->exec();
    définition des class :

    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
    class QSpecialButton : public QPushButton
    {
       Q_OBJECT
     
    public:
       QSpecialButton(...);
     
    public slots:
        void playsound();
    protected:
       // virtual bool event(QEvent * ev);
    private:
     
     
    };
     
    class QSpecialDialog : public QDialog
    {
       Q_OBJECT
     
    public:
       QSpecialDialog(QApplication * app,QWidget *parent = 0);
     
    public slots:
    protected:
        virtual bool event(QEvent * ev);
    private:
       QApplication * appli;
     
     
    };
    enfin le code associé :


    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
    57
    58
    59
    60
    61
    62
    QSpecialButton::QSpecialButton(... ):QPushButton(parent)
    {
     
        appli = app;
     
        QFile file(styleS);
    	file.open(QFile::ReadOnly);
    	QString styleSheet = QLatin1String(file.readAll());
    	setStyleSheet(styleSheet);
     
        setCursor(Qt::OpenHandCursor);
       setAttribute(Qt::WA_AcceptTouchEvents);
       setAttribute(Qt::WA_TransparentForMouseEvents);
       setFlat(true);
       setAcceptDrops(true);
     
    }
     
     
     
    QSpecialDialog::QSpecialDialog(QApplication * app,QWidget *parent ):QDialog(parent)
    {
     
        appli = app;
     
     
     
       setAttribute(Qt::WA_AcceptTouchEvents);
     
    }
     
     
     bool QSpecialDialog::event(QEvent *ev)
     {
         if (ev->type() == QEvent::TouchBegin)
          {
              QList<QTouchEvent::TouchPoint> az;
              QList<QPoint> ab;
              az=static_cast<QTouchEvent*>(ev)->touchPoints ();
     
     
              for(int i=0;i<az.size();i++)
              {
                  ab.append((az[i].pos()).toPoint());
                  QSpecialButton *sbutton = qobject_cast<QSpecialButton *>((appli->widgetAt(ab[i])));
                    if (sbutton) // Notre widget est un textEdit
                        {
                        sbutton->playsound();
                        sbutton->animateClick();
     
                        }
     
              }
     
                 return true;
          }
     
     
     
     
        return QWidget::event(ev);
     }

    Donc normalement le setAttribute(Qt::WA_TransparentForMouseEvents); devrait me permettre de récupérer le touchevent dans le QDialog et les boutons que je touche devraient s'activer, mais rien n'y fait, aucun bouton de réagit

  4. #4
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Par défaut
    En lisant la doc française, je vois ceci, concernant Qt::WA_TransparentForMouseEvents :

    Quand il est activé, cet attribut désactive la livraison des événements de la souris au widget et à ses enfants. Les événements de la souris sont livrés aux autres widgets comme si le widget et ses enfants n'étaient pas présents dans la hiérarchie des widgets ; les clics de souris et les autres événements « passent » effectivement entre eux. Cet attribut est désactivé par défaut.
    Source : http://qt.developpez.com/doc/4.7/qt/...attribute-enum

    Ce qui signifie que les QSpecialButtons et leurs widgets enfants ne recevront pas les évènements de souris.

    Concernant votre fonction event() et votre condition dedans, êtes-vous sûr qu'on entre bien dedans ?
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Par défaut
    rebonjour,
    Je pense que c'est justement ca le probleme.
    J'ai rajouté un hide(); à l'entrée de l'event :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     bool QSpecialDialog::event(QEvent *ev)
     {
         if (ev->type() == QEvent::TouchBegin)
          {
              hide();
    mais le dialog disparait seulement quand je touche la partie noire (entre les boutons) mais pas sur les boutons, alors qu'ils devraient être transparents au touché. (ou au clic, j'ai vérifié aussi si le clic souris faisait quelque chose, mais rien)

    D’emblée je pense à deux choses : soit quelque chose dans mon code réactive le clic sur les boutons, soit ce sont les HBoxLayout qui ressoivent les events (est ce possible?)
    ...ou autres chose ...

  6. #6
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Par défaut
    Bonjour,

    Je vais peut-être dire une bêtise, mais selon mes souvenirs, les évènements sont propagés à partir du widget enfant recevant initialement l'évènement (vos boutons, quand fait l'évènement associé dessus) dans la chaine des parents jusqu'à ce qu'un widget daigne de faire event->accept() et non event->ignore(). Cette solution reste tout de même barbare ; pourquoi ne pas simplement réimplémenter la fonction event() de vos boutons ?

    Bonne continuation,
    Amnell.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  7. #7
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Par défaut
    pas sur les boutons parce que touch points me retourne les coordonnée par rapport au coin en haut à gauche du bouton et non par rapport au Dialog, de plus, il ne capte pas le second touch en dehors de ses frontières.

    Mais je lache l'affaire, parce que j'ai l'impression que touchPoints ne capte que 2 touch et pas plus (la technologie ne le permet surement pas, ca doit dépendre de mon écran). En gros j'ai fais un setText sur les boutons avec pour argument le nombre total de touchPoints, j'aurais "2" au mieux.

    En gros mon écran c'est pas un multi touch, c'est un bi-touch.

    Pour mon programme, j'aurais voulu jouer plusieur intruments en meme temps mais si c'est réduit à deux instru et faire tout un schmilblick dans le code pour ca autant laisser à 1.

Discussions similaires

  1. Quel SGBD correspond aux fichiers à extension .DAT
    Par jcpitaud dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 12/04/2006, 20h11
  2. Correspondance de types lors d'un SELECT
    Par Alain Dionne dans le forum ASP
    Réponses: 5
    Dernier message: 18/05/2004, 20h54
  3. [debutant] correspondance JAVA C++ pour pointeur de fonction
    Par davidoff_tls dans le forum Langage
    Réponses: 7
    Dernier message: 15/04/2004, 09h13
  4. Récupérer le nom du fichier spool correspondant à un job
    Par chtiot dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 23/02/2004, 20h28

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