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 :

Application GTK simple


Sujet :

GTK+ avec C & C++

  1. #1
    Candidat au Club
    Application GTK simple
    Bonjour

    Pour des raisons bassement technique j'ai fait le choix de migrer sur LINUX. Avant je codait du JAVA en pro et FREEBASIC pour le plaisir. En migrant sur LINUX plus de WINAPI, et donc DIRECTION GTK. En ce moment je me suis mis en tete de realiser une appli simple avec une barre d'outils (4), ou chaque outil permet de basculer entre 4 groupes de composants.

    je cherche donc un tuto qui explique comment creer dans une fenetre la chose.

  2. #2
    Membre régulier
    hello

    je ne pense pas que tu trouveras directement un tuto qui te mache le travail.

    Cela étant je te suggère de te baser sur une trame telle que la suivante :

    1 utiliser une base d'appli genre gtkapplication. tu as dans gtk3-demo d'excellent exemple c'est fourni avec gtk+

    2 ensuite il te faut choisir un mode d'affichage des outils

    premiere option des icones
    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
     
      /* Creation du bouton "Nouveau" */
      {
        GtkWidget *button = NULL;
     
        button = gtk_button_new_from_icon_name("document-new",GTK_ICON_SIZE_BUTTON);
        gtk_widget_set_tooltip_text (GTK_WIDGET (button), "Nouveau document");
        g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (cb_new), text_view);
        gtk_box_pack_start (GTK_BOX (button_box), button, expand, fill, padding);
        //gtk_box_pack_start (GTK_BOX (button_box), button, FALSE, FALSE, 0);
      }
     
      /* Creation du bouton "Ouvrir" */
      {
        GtkWidget *button = NULL;
     
        button = gtk_button_new_from_icon_name("document-open",GTK_ICON_SIZE_BUTTON);
        gtk_widget_set_tooltip_text (GTK_WIDGET (button), "Ouvrir un document");
        g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (cb_open), text_view);
        gtk_box_pack_start (GTK_BOX (button_box), button, expand, fill, padding);
      }
     
      /* Creation du bouton "Sauvegarder" */
      {
        GtkWidget *button = NULL;
     
        button = gtk_button_new_from_icon_name("document-save",GTK_ICON_SIZE_BUTTON);
        gtk_widget_set_tooltip_text (GTK_WIDGET (button), "Enregistrer un document");
        g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (cb_save), NULL);
        gtk_box_pack_start (GTK_BOX (button_box), button, expand, fill, padding);
      }
     
      /* Creation du bouton "Sauvegarder sous" */
      {
        GtkWidget *button = NULL;
     
        button = gtk_button_new_from_icon_name("document-save-as",GTK_ICON_SIZE_BUTTON);
        gtk_widget_set_tooltip_text (GTK_WIDGET (button), "Enregistrer un document sous...");
        g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (cb_saveas), NULL);
        gtk_box_pack_start (GTK_BOX (button_box), button, expand, fill, padding);
      }
     
      /* Creation du bouton "Fermer" */
      {
        GtkWidget *button = NULL;
        button = gtk_button_new_from_icon_name("process-stop",GTK_ICON_SIZE_BUTTON);
        gtk_widget_set_tooltip_text (GTK_WIDGET (button), "Fermer le document");
        g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (cb_close), NULL);
        gtk_box_pack_start (GTK_BOX (button_box), button, expand, fill, padding);
      }
     
      /* Creation du bouton "Quitter" */
      {
        GtkWidget *button = NULL;
     
        button = gtk_button_new_from_icon_name("application-exit",GTK_ICON_SIZE_BUTTON);
        gtk_widget_set_tooltip_text (GTK_WIDGET (button), "Quitter l'éditeur");
        g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (cb_quit), NULL);
        gtk_box_pack_end (GTK_BOX (button_box), button, expand, fill, padding);
      }


    autre piste avec un menu toolbar
    ton menu toolbar est alimenté par 4 boutons qui auront chacun leur callback
    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
    GtkWidget * create_toolbar (GtkWidget *sourceview)
    {
    	GtkWidget *toolbar;
    	GtkToolItem *item;
    	GtkToolItem *Separator;
     
    	toolbar = gtk_toolbar_new ();
    	gtk_widget_set_valign (toolbar, GTK_ALIGN_CENTER);
     
    	/* production d'un lot de bouton */
    	item = gtk_tool_button_new (NULL, NULL);
    	gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (item), "go-next");
    	gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
    	g_signal_connect(item, "clicked",    G_CALLBACK	(cb_ButtonClicked_toNext),NULL);
     
    	item = gtk_tool_button_new (NULL, NULL);
    	gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (item), "go-previous");
    	gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
    	g_signal_connect(item, "clicked",    G_CALLBACK	(cb_ButtonClicked_toPrevious),NULL);
     
    	/* production d'un lot de bouton pour mon affaire*/
    	item = gtk_tool_button_new (NULL,NULL );
    	gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (item), "document-new");
    	gtk_tool_item_set_tooltip_markup (GTK_TOOL_ITEM (item), "Nouveau document");
    	gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
    	g_signal_connect(item, "clicked",    G_CALLBACK	(cb_ButtonClicked_toNew),NULL);
     
    	item = gtk_tool_button_new (NULL,NULL);
    	gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (item),"document-open");
    	gtk_tool_item_set_tooltip_markup(GTK_TOOL_ITEM (item), "<b>Ouvrir</b> un fichier texte existant");  
    	gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
    	g_signal_connect(item, "clicked",    G_CALLBACK	(cb_ButtonClicked_toOpen),NULL);
     
    	item = gtk_tool_button_new (NULL,NULL);
    	gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (item),"document-open-recent");
    	gtk_tool_item_set_tooltip_markup(GTK_TOOL_ITEM (item), "<b>Ouvrir</b> un fichier traité récemment");  
    	gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
    	g_signal_connect(item, "clicked",    G_CALLBACK	(cb_ButtonClicked_toRecent),NULL);
     
    	item = gtk_tool_button_new (NULL,NULL );
    	gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (item), "document-save");
    	gtk_tool_item_set_tooltip_markup (GTK_TOOL_ITEM (item), "<b>Enregistrez</b> le fichier courant");  
    	gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
    	g_signal_connect(item, "clicked",    G_CALLBACK	(cb_ButtonClicked_toSave),NULL);
     
    	item = gtk_tool_button_new (NULL,NULL );
    	gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (item), "document-save-as");
    	gtk_tool_item_set_tooltip_markup (GTK_TOOL_ITEM (item), "<b>Enregistrez</b> sous ....");  
    	gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
    	g_signal_connect(item, "clicked",    G_CALLBACK	(cb_ButtonClicked_toSaveAs),NULL);
     
    	/* Avec des séparateurs */
    	Separator = gtk_separator_tool_item_new();
    	gtk_toolbar_insert (GTK_TOOLBAR (toolbar), Separator, -1);
    	/* fin separator */


    3 dans chaque callback tu définis les 4 contextes


    modele de callback pour bouton
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void cb_open (GtkWidget *widget, gpointer user_data)
    {
     
     ......
      /* Parametre inutilise */
      (void)widget;
      (void)user_data;
    }

    modele de callback pour toolbar
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    gint cb_ButtonClicked_toSaveAs( GtkWidget *widget,GdkEvent  *event,  gpointer   data )
    {
     .......
      return(FALSE);
      (void)widget;
      (void)event;
      (void)data;
    }

  3. #3
    Candidat au Club
    Citation Envoyé par turboiii Voir le message
    hello

    je ne pense pas que tu trouveras directement un tuto qui te mache le travail.

    Cela étant je te suggère de te baser sur une trame telle que la suivante :

    1 utiliser une base d'appli genre gtkapplication. tu as dans gtk3-demo d'excellent exemple c'est fourni avec gtk+

    2 ensuite il te faut choisir un mode d'affichage des outils

    premiere option des icones
    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
     
      /* Creation du bouton "Nouveau" */
      {
        GtkWidget *button = NULL;
     
        button = gtk_button_new_from_icon_name("document-new",GTK_ICON_SIZE_BUTTON);
        gtk_widget_set_tooltip_text (GTK_WIDGET (button), "Nouveau document");
        g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (cb_new), text_view);
        gtk_box_pack_start (GTK_BOX (button_box), button, expand, fill, padding);
        //gtk_box_pack_start (GTK_BOX (button_box), button, FALSE, FALSE, 0);
      }
     
      /* Creation du bouton "Ouvrir" */
      {
        GtkWidget *button = NULL;
     
        button = gtk_button_new_from_icon_name("document-open",GTK_ICON_SIZE_BUTTON);
        gtk_widget_set_tooltip_text (GTK_WIDGET (button), "Ouvrir un document");
        g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (cb_open), text_view);
        gtk_box_pack_start (GTK_BOX (button_box), button, expand, fill, padding);
      }
     
      /* Creation du bouton "Sauvegarder" */
      {
        GtkWidget *button = NULL;
     
        button = gtk_button_new_from_icon_name("document-save",GTK_ICON_SIZE_BUTTON);
        gtk_widget_set_tooltip_text (GTK_WIDGET (button), "Enregistrer un document");
        g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (cb_save), NULL);
        gtk_box_pack_start (GTK_BOX (button_box), button, expand, fill, padding);
      }
     
      /* Creation du bouton "Sauvegarder sous" */
      {
        GtkWidget *button = NULL;
     
        button = gtk_button_new_from_icon_name("document-save-as",GTK_ICON_SIZE_BUTTON);
        gtk_widget_set_tooltip_text (GTK_WIDGET (button), "Enregistrer un document sous...");
        g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (cb_saveas), NULL);
        gtk_box_pack_start (GTK_BOX (button_box), button, expand, fill, padding);
      }
     
      /* Creation du bouton "Fermer" */
      {
        GtkWidget *button = NULL;
        button = gtk_button_new_from_icon_name("process-stop",GTK_ICON_SIZE_BUTTON);
        gtk_widget_set_tooltip_text (GTK_WIDGET (button), "Fermer le document");
        g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (cb_close), NULL);
        gtk_box_pack_start (GTK_BOX (button_box), button, expand, fill, padding);
      }
     
      /* Creation du bouton "Quitter" */
      {
        GtkWidget *button = NULL;
     
        button = gtk_button_new_from_icon_name("application-exit",GTK_ICON_SIZE_BUTTON);
        gtk_widget_set_tooltip_text (GTK_WIDGET (button), "Quitter l'éditeur");
        g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (cb_quit), NULL);
        gtk_box_pack_end (GTK_BOX (button_box), button, expand, fill, padding);
      }


    autre piste avec un menu toolbar
    ton menu toolbar est alimenté par 4 boutons qui auront chacun leur callback
    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
    GtkWidget * create_toolbar (GtkWidget *sourceview)
    {
    	GtkWidget *toolbar;
    	GtkToolItem *item;
    	GtkToolItem *Separator;
     
    	toolbar = gtk_toolbar_new ();
    	gtk_widget_set_valign (toolbar, GTK_ALIGN_CENTER);
     
    	/* production d'un lot de bouton */
    	item = gtk_tool_button_new (NULL, NULL);
    	gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (item), "go-next");
    	gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
    	g_signal_connect(item, "clicked",    G_CALLBACK	(cb_ButtonClicked_toNext),NULL);
     
    	item = gtk_tool_button_new (NULL, NULL);
    	gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (item), "go-previous");
    	gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
    	g_signal_connect(item, "clicked",    G_CALLBACK	(cb_ButtonClicked_toPrevious),NULL);
     
    	/* production d'un lot de bouton pour mon affaire*/
    	item = gtk_tool_button_new (NULL,NULL );
    	gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (item), "document-new");
    	gtk_tool_item_set_tooltip_markup (GTK_TOOL_ITEM (item), "Nouveau document");
    	gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
    	g_signal_connect(item, "clicked",    G_CALLBACK	(cb_ButtonClicked_toNew),NULL);
     
    	item = gtk_tool_button_new (NULL,NULL);
    	gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (item),"document-open");
    	gtk_tool_item_set_tooltip_markup(GTK_TOOL_ITEM (item), "<b>Ouvrir</b> un fichier texte existant");  
    	gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
    	g_signal_connect(item, "clicked",    G_CALLBACK	(cb_ButtonClicked_toOpen),NULL);
     
    	item = gtk_tool_button_new (NULL,NULL);
    	gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (item),"document-open-recent");
    	gtk_tool_item_set_tooltip_markup(GTK_TOOL_ITEM (item), "<b>Ouvrir</b> un fichier traité récemment");  
    	gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
    	g_signal_connect(item, "clicked",    G_CALLBACK	(cb_ButtonClicked_toRecent),NULL);
     
    	item = gtk_tool_button_new (NULL,NULL );
    	gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (item), "document-save");
    	gtk_tool_item_set_tooltip_markup (GTK_TOOL_ITEM (item), "<b>Enregistrez</b> le fichier courant");  
    	gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
    	g_signal_connect(item, "clicked",    G_CALLBACK	(cb_ButtonClicked_toSave),NULL);
     
    	item = gtk_tool_button_new (NULL,NULL );
    	gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (item), "document-save-as");
    	gtk_tool_item_set_tooltip_markup (GTK_TOOL_ITEM (item), "<b>Enregistrez</b> sous ....");  
    	gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
    	g_signal_connect(item, "clicked",    G_CALLBACK	(cb_ButtonClicked_toSaveAs),NULL);
     
    	/* Avec des séparateurs */
    	Separator = gtk_separator_tool_item_new();
    	gtk_toolbar_insert (GTK_TOOLBAR (toolbar), Separator, -1);
    	/* fin separator */


    3 dans chaque callback tu définis les 4 contextes


    modele de callback pour bouton
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void cb_open (GtkWidget *widget, gpointer user_data)
    {
     
     ......
      /* Parametre inutilise */
      (void)widget;
      (void)user_data;
    }

    modele de callback pour toolbar
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    gint cb_ButtonClicked_toSaveAs( GtkWidget *widget,GdkEvent  *event,  gpointer   data )
    {
     .......
      return(FALSE);
      (void)widget;
      (void)event;
      (void)data;
    }
    Merci pour le tuyau, je vais regarder ca de pres pour pouvoir avancer.