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 :

[GTK+ 3] Problème de hiérarchie des widgets : récupérer le toplevel d'un sous-menu


Sujet :

GTK+ avec C & C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut [GTK+ 3] Problème de hiérarchie des widgets : récupérer le toplevel d'un sous-menu
    Bonjour,

    Je débute avec GTK+ et après deux jours à galérer, je crois que j'ai besoin d'aide
    J'ai crée une interface avec GTK+ (v3) ainsi constituée :

    Fenêtre
    ==> Grille
    ====> Barre de Menu
    ======> Menu
    ========> Sous-Menu
    ====> Widget perso

    Quand je clique sur les éléments du menu (MENU et SOUS-MENU), j'affiche le chemin des widgets dans la fonction de callback (la même pour les deux) grâce à gtk_widget_path_to_string.
    Voici ce que j'obtiens :

    Menu : GtkWindow.background GtkGrid GtkMenuBar.menubar GtkMenuItem.menuitem
    Sous-Menu : GtkWindow.background GtkGrid GtkMenuBar.menubar GtkMenuItem.menuitem GtkWindow.background GtkMenu.menu GtkMenuItem.menuitem
    Or, dans ce callback, j'aimerais remonter jusqu'à la fenêtre principale pour ensuite accéder à la grille et à mon widget perso.
    J'utilise donc get_toplevel et affiche le chemin du résultat dans les deux cas :

    Menu : GtkWindow.background
    Sous-Menu : GtkWindow.background GtkGrid GtkMenuBar.menubar GtkMenuItem.menuitem GtkWindow.background
    Autrement dit, je parviens bien à remonter jusqu'à la fenêtre dans le cas du menu, mais pas du sous-menu.
    Une fenêtre s'intercale en effet dans la hiérarchie de ce dernier (surement pour symboliser le cadre du sous-menu) qui semble m'empecher de remonter plus haut.

    La documentation précise bien qu'on peut tester le flag TOP_LEVEL pour vérifier que c'est bien la fenêtre ancêtre ... mais la fenêtre posant problème l'a aussi !

    Je ne sais donc pas comment remonter jusqu'à ma fenêtre ...
    Comment puis-je faire ?

    Merci d'avance

    PS : au cas où, les extraits du code suspect :

    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
    void Callback (GtkWidget * pWidget, gpointer * pData) {
        // Widget
    GtkWidgetPath * p = gtk_widget_get_path(pWidget);
        printf("Widget : %s\n", str, gtk_widget_path_to_string(p));
    // Ancetre
    p=gtk_widget_get_path(gtk_widget_get_toplevel(pWidget));
    printf("Ancetre : %s\n", str, gtk_widget_path_to_string(p));
    }
     
    GtkWidget* MainWindow_create(Data * pData) {
        // Fenêtre
        GtkWidget * pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
       // ...
     
        // Layout
        GtkWidget* pLayout = gtk_grid_new();
     
        // Menu
        // MENU
        GtkWidget * pMenu = gtk_menu_bar_new();
     
        //MENU Fichier
        GtkWidget* pItem = gtk_menu_item_new_with_label("Fichier");
        gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pItem);
        g_signal_connect(G_OBJECT(pItem), "activate", G_CALLBACK(Callback), pData);
     
        GtkWidget* pSub = gtk_menu_new();
        gtk_menu_item_set_submenu(GTK_MENU_ITEM(pItem), pSub);
     
        pItem = gtk_menu_item_new_with_label("Nouveau");
        gtk_menu_shell_append(GTK_MENU_SHELL(pSub), pItem);
        g_signal_connect(G_OBJECT(pItem), "activate", G_CALLBACK(Callback), pData);
        gtk_widget_show_all(pMenu);
     
        // World
        GtkWidget * pWidget = CustomWidget_create(pData);
        gtk_widget_show(pWidget);
     
        // Mise en place
        gtk_container_add(GTK_CONTAINER(pWindow), GTK_WIDGET(pLayout));
        gtk_grid_attach(GTK_GRID(pLayout), pMenu, 0, 0, 1, 1);
        gtk_grid_attach_next_to(GTK_GRID(pLayout), pWidget, pMenu, GTK_POS_BOTTOM, 1, 1);
     
        gtk_widget_show(pLayout);
     
        return pWindow;
    }

  2. #2
    Membre confirmé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 329
    Points : 606
    Points
    606
    Par défaut
    Bonjour,

    Tu peux te servir de l'argument pData du callback pour passer le pointeur, ce qui évite toute gymnastique compliquée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        g_signal_connect(G_OBJECT(pItem), "activate", G_CALLBACK(Callback), pWindow);
    et le call back
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void Callback (GtkWidget * pWidget, gpointer * pData) {
      GtkWidget * pWindow = (GtkWidget *)pData;
    }
    et si il faut passer d'autres données dans le callback, on définit alors une structure dont un des éléments est pWindow.
    Le casting est sans doute un peu redondant, mais je ne suis pas sûr que certains compilateurs pointilleux ne donnent pas de warning s'il est omit.
    GraceGTK: a plotting tool at https://sourceforge.net/projects/gracegtk

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/03/2013, 16h42
  2. [Dojo] récupérer état des Widgets (en erreur ?)
    Par okilele dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 19/01/2010, 01h07
  3. Problème de placement des widgets dans un layout
    Par maroua_mm dans le forum Qt
    Réponses: 1
    Dernier message: 20/08/2009, 15h16
  4. QTabWidget - Problème d'affichage des widgets
    Par jimaitou dans le forum Débuter
    Réponses: 7
    Dernier message: 22/03/2009, 02h55
  5. Problème installation à partir des sources de GTK+
    Par Shugo78 dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 29/08/2007, 15h00

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