Comment déconnecter un signal dans gtkmm-3.0

a marqué ce sujet comme résolu.

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.

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.

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

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