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

GTK+ avec C & C++ Discussion :

Custom widget avec Gtkmm3, gestion des events


Sujet :

GTK+ avec C & C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 34
    Points : 30
    Points
    30
    Par défaut Custom widget avec Gtkmm3, gestion des events
    Bonjour,

    Jai créé un "Custom widget" avec Gtkmm en suivant cette documentation:
    https://developer-old.gnome.org/gtkm...idgets.html.en

    J’ai trouvé une solution pour faire réagir le widget aux clicks de souris mais qui me semble un peu bancale:
    Dans ma classe d'affichage, je crée un objet EventBox dans laquelle j’ajoute mon SimpleWidget et qui me permet de gérer les événements de la souris.
    Je peux ensuite connecter des fonctions pour ces événement press/release et ainsi changer l’affichage. Mais cela veut dire que je dois pour chaque SimpleWidget que j'ajoute dans mon ihm, ajouter une EventBox et créer autant de fonctions n_eventbox_button_press et on_eventbox_button_release que j'ai de SimpleWidget ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      m_VBox.pack_start(m_EventBox, Gtk::PACK_EXPAND_WIDGET);
     
      m_EventBox.add(m_SimpleWidget);
      m_EventBox.set_events(Gdk::BUTTON_PRESS_MASK);
      m_EventBox.signal_button_press_event().connect(
        sigc::mem_fun(*this, &ExampleWindow::on_eventbox_button_press) );
     
      m_EventBox.signal_button_release_event().connect(
        sigc::mem_fun(*this, &ExampleWindow::on_eventbox_button_release) );
    J’aimerai que la gestion de ces événements de la souris soit intégrés a ma classe Gtk::Widget et non rajoutés par la suite.
    Auriez-vous une piste pour intégrer directement cette gestion des événements dans ma classe SimpleWidget ?

    Mon projet en pj, cela sera peut être plus clair ...simple_widget.7z

  2. #2
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Tu dois implémenter la fonction virtuelle realize() de ton widget pour qu'il ait une GdkWindow et qu'il puisse recevoir les events.
    Sinon, si tu veux éviter d'avoir à faire tout ça, tu le fais dériver d'un widget plus évolué, comme une GtkBox, ou bien même une GtkEventBox justement.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 34
    Points : 30
    Points
    30
    Par défaut
    Merci balkany, j'ai dérivé ma Classe SimpleWidget de Gtk::EventBox et cela me permet de gérer les Events en interne de la classe.
    Par contre, j'essai d'implémenter une fonction SimpleWidget::signal_clicked() pour pouvoir l'utiliser comme un boutton, mais je bloque.

    J'ai regardé la classe button qui a cette fonction, mais je ne trouve que le prototype :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Glib::SignalProxy0< void > signal_clicked();
    Une idée ?
    simple_widget_v2.7z

  4. #4
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Eh bien comme tu le dis, "clicked" est un signal de la classe GtkButton, donc si tu veux en disposer, il faut que tu fasses dériver ton widget de GtkButton.
    Ensuite oui, le prototype est celui-là, à toi de mettre ce que tu veux dans le corps de fonction lorsque le bouton est cliqué.
    Il n'y a pas vraiment de modèle dans ce cas, c'est à toi de savoir ce que tu veux faire.

  5. #5
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Bonsoir.

    Puisque tu accèdes aux événements de la souris le principe est de créer tes propres signaux plutôt que d’essayer d’hériter d’un autre widget.

    Je ne programme pas avec gtkmm mais avec gtk. Tu peux regarder dans ma signature. J’ai écrit il y a quelques temps un tutoriel de création d’un widget personnalisé avec création de signaux personnels. Ce devrait une base de travail pour adapter tout ce petit monde à gtkmm 😉

  6. #6
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Franchement je ne vois pas trop l'intérêt de réinventer la roue, à moins que ce soit pour l'exercice.
    Si j'ai besoin d'un bouton personnalisé (ce qui est plutôt rare) je le fais dériver de GtkButton (ou d'une de ses sous-classes), et si j'aoute des signaux c'est qu'ils n'existent pas déjà dans les classes parentes.

  7. #7
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par balkany Voir le message
    Franchement je ne vois pas trop l'intérêt de réinventer la roue, à moins que ce soit pour l'exercice.
    Si j'ai besoin d'un bouton personnalisé (ce qui est plutôt rare) je le fais dériver de GtkButton (ou d'une de ses sous-classes), et si j'aoute des signaux c'est qu'ils n'existent pas déjà dans les classes parentes.
    Imaginons que tu décides de créer un jeu. Le seul widget utilisé est un GtkDrawingArea. Ton jeu est capable d'afficher des menus avec des boutons dans ce GtkDrawingArea. Il est alors intéressant de créer un objet dérivé d'un GObject par exemple capable d'émettre un signal qui s'apparente au "clicked" d'un bouton. Tu réinventes la roue à ce moment là. .

    Ceci dit, si tu restes dans le principe de construction d'une interface avec les widgets disponibles il peut être avantageux de dériver d'un widget qui dispose déjà du signal convoité si tenté que cela soit possible en fonction de tes besoins.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 34
    Points : 30
    Points
    30
    Par défaut
    Merci pour vos conseils, j'avais déjà regardé différents tutos en c, mais je vais chercher celui de gerald3d,
    Je cherche à faire un widget de type Knob (dial en qt), pour du développement d'applications audio. Certes, la fonctionnalité est la même qu'un scale mais cela permet d'avoir une interface plus condensée comportant de multiples paramètres. Ce n'est donc pas qu'esthétique même si cela a son importance, sur une console audio, tu as ces deux types de contrôle, on est moins perdu !!

    Ainsi, mon but n'est pas d'implémenter de nouveaux signaux, mais de changer l'affichage. J'aurais préféré dériver mon widget de la classe Scale et réimplémenter la fonction on_draw. Je ne sais pas si c'est possible. Mais c’était aussi un exercie pour mieux comprendre Gtk…
    Mon code fonctionnel avec mes propres signaux.
    Fichiers attachés Fichiers attachés

  9. #9
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Imaginons que tu décides de créer un jeu. Le seul widget utilisé est un GtkDrawingArea. Ton jeu est capable d'afficher des menus avec des boutons dans ce GtkDrawingArea. Il est alors intéressant de créer un objet dérivé d'un GObject par exemple capable d'émettre un signal qui s'apparente au "clicked" d'un bouton. Tu réinventes la roue à ce moment là. .
    Ok dans ce type de cas effectivement, mais j'avoue que je n'ai pas affaire à ça tous les jours

    Citation Envoyé par Gouxosor Voir le message
    Ainsi, mon but n'est pas d'implémenter de nouveaux signaux, mais de changer l'affichage. J'aurais préféré dériver mon widget de la classe Scale et réimplémenter la fonction on_draw. Je ne sais pas si c'est possible.
    J'imagine qu'il vaudrait mieux que tu dérives de la classe parente GtkRange et que tu implémentes entièrement la fonction virtuelle draw() (je suis un peu surpris que ce type de "potard" n'existe pas déjà en fait).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gestion des event avec un objet ole MsExcel
    Par rdemont dans le forum Delphi
    Réponses: 3
    Dernier message: 03/07/2006, 16h08
  2. Problème avec la "Gestion des bibliothèques dynamiques"
    Par GoustiFruit dans le forum Delphi
    Réponses: 15
    Dernier message: 31/05/2006, 09h54
  3. Importer avec Ogre / Gestion des collisions
    Par alex6891 dans le forum Ogre
    Réponses: 9
    Dernier message: 19/02/2006, 17h43
  4. Problème avec la gestion des événements
    Par CynO dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 17/10/2005, 10h07
  5. [C#] Gestion des Events d'un control Composite
    Par lord_paco dans le forum ASP.NET
    Réponses: 3
    Dernier message: 07/10/2005, 09h10

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