Comment déconnecter un signal dans gtkmm-3.0

a marqué ce sujet comme résolu.
Auteur du sujet

Bonjour,

Depuis quelques temps j’apprends le c++ et je me suis mis à gtkmm. J’ai fait un programme pour calculer surface et volume depuis une fenêtre. Tout fonctionne. Sauf une chose concernant l’utilisation de signal_activate()

Voici un bout du code concerné

switch (forme)
  {
  case 1: //carré
    cacheEntry();
    labelForme.set_label(listeDeroulante.get_active_text());
    labelLongueur.set_label("longueur");
    elongueur.signal_activate().connect([this]() { calcul(); });
    break;
  case 2: //rectangle
    //Fenetre::sigc::connection::disconnect(elargeur);
    elargeur.set_sensitive(true);
    labelForme.set_label(listeDeroulante.get_active_text());
    labelLongueur.set_label("longueur");
    labelLargeur.set_label("largeur");
    elongueur.signal_activate().connect([this]() { elargeur.grab_focus(); });
    elargeur.signal_activate().connect([this]() { calcul(); });
    break;

Depuis la fenêtre si je commence par l’option l’option 2 tout se passe correctement. Si je passe par l’option 1 et ensuite option 2, en appuyant sur la touche entrée le focus passe bien dans la case suivante mais lance également la fonction calcul() , ce que je cherche à éviter. Donc je pense que le signal_activate n’est pas déconnecter de elongueur après passage de l’option 1.

Après moult recherche sur internet je n’ai pas compris comment déconnecter le signal. Merci pour l’aide.

+0 -0

Salut!

La fonction connect() d’un objet GObject renvoie un handler qui peut être utilisé pour déconnecter ce signal plus tard. En C++, cela donne ce qui est décrit ici. Ainsi, tu peux stocker le handler à un endroit approprié, puis le déconnecter dans une des branches du switch.

+0 -0
Auteur du sujet

Salut!

La fonction connect() d’un objet GObject renvoie un handler qui peut être utilisé pour déconnecter ce signal plus tard. En C++, cela donne ce qui est décrit ici. Ainsi, tu peux stocker le handler à un endroit approprié, puis le déconnecter dans une des branches du switch.

Vanadiae

Bonjour,

si j’ai compris le lien que tu m’as donné voici le code que j’ai écrit

sigc::connection c = elongueur.signal_activate().connect([this]() { calcul(); });
  switch (forme)
  {
  case 1: //carré
    c.connected();
    cacheEntry();
    labelForme.set_label(listeDeroulante.get_active_text());
    labelLongueur.set_label("longueur");
    break;
  case 2: //rectangle
    c.disconnect();
    elargeur.set_sensitive(true);
    labelForme.set_label(listeDeroulante.get_active_text());
    labelLongueur.set_label("longueur");
    labelLargeur.set_label("largeur");
    elongueur.signal_activate().connect([this]() { elargeur.grab_focus(); });
    elargeur.signal_activate().connect([this]() { calcul(); });
    break;

Mais ça ne change rien. Le switch 1 fonctionne avec c.connect()

le switch 2 avec c.disconnect() ne produit pas l’effet voulu

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte