Les deux révisions précédentesRévision précédente | |
issue220:tutoriel1 [2025/08/31 07:49] – d52fr | issue220:tutoriel1 [2025/08/31 08:15] (Version actuelle) – d52fr |
---|
Written by Alan Crispin** | Written by Alan Crispin** |
| |
Programmation en C dans GTK4 - partie 1 | //Bandeau de titre : //Programmation GTK4 en C - partie 1 |
| |
| |
Introduction | Introduction |
| |
Cet article est le premier d'une série sur le développement d'applications GTK4 en C. Nous développerons quelques petits programmes pour illustrer l'utilisation de GTK4 et des bibliothèques associées pour la programmation d'interfaces graphiques (GUI). Ce premier article présente GTK4. Il explique comment l'installer, le compilateur C et l'outil d'automatisation de compilation GNU Make. Une petite application de démonstration est développée pour illustrer la création d'une fenêtre et l'utilisation de widgets de type bouton et étiquette. Une capture d'écran est présentée ci-dessous. | Cet article est le premier d'une série sur le développement d'applications GTK4 en C. Nous développerons quelques petits programmes pour illustrer l'utilisation de GTK4 et des bibliothèques associées pour la programmation d'interfaces graphiques (GUI). Ce premier article présente GTK4. Il explique comment l'installer, le compilateur C et l'outil d'automatisation de compilation GNU Make. Une petite application de démonstration est développée pour illustrer la création d'une fenêtre et l'utilisation de widgets de type bouton et étiquette. |
| |
Tout au long de cette série, nous utiliserons Ubuntu 24.04, qui utilise la version GTK4.14 de GTK4. Cette série suppose que le lecteur maîtrise le langage de programmation C. De nombreux tutoriels et vidéos en ligne sur la programmation C sont disponibles. | Tout au long de cette série, nous utiliserons Ubuntu 24.04, qui utilise la version GTK4.14 de GTK4. Cette série suppose que le lecteur maîtrise le langage de programmation C. De nombreux tutoriels et vidéos en ligne sur la programmation C sont disponibles. |
GTK4 | GTK4 |
| |
GTK4 est une bibliothèque de création d'interfaces utilisateur graphiques, largement disponible dans les dépôts des distributions Linux. C'est une boîte à outils portable, ce qui signifie que les applications écrites pour une plateforme donnée peuvent être portées vers une autre. Linux est bien sûr la plateforme privilégiée. Bien que le langage C soit utilisé dans ces articles, GTK4 dispose de liaisons pour d'autres langages de programmation. GTK est sous licence GNU Library General Public License v2. | GTK4 est une bibliothèque de création d'interfaces utilisateur graphiques (GUI), largement disponible dans les dépôts des distributions Linux. C'est une boîte à outils portable, ce qui signifie que les applications écrites pour une plateforme donnée peuvent être portées vers une autre. Linux est bien sûr la plateforme privilégiée. Bien que le langage C soit utilisé dans ces articles, GTK4 dispose de liaisons pour d'autres langages de programmation. GTK est sous licence GNU Library General Public License v2. |
| |
Gtk4 utilise la bibliothèque GObject, qui offre des fonctionnalités de programmation orientée objet (POO) grâce à des macros de type fonction. En POO, les constructeurs permettent d'initialiser un nouvel objet à partir d'une classe spécifique. Ainsi, lorsque vous utilisez l'API GTK4, celle-ci fournit une liste de classes avec leurs constructeurs, propriétés, méthodes et signaux. | Gtk4 utilise la bibliothèque GObject, qui offre des fonctionnalités de programmation orientée objet (POO) grâce à des macros de type fonction. En POO, les constructeurs permettent d'initialiser un nouvel objet à partir d'une classe spécifique. Ainsi, lorsque vous utilisez l'API GTK4, celle-ci fournit une liste de classes avec leurs constructeurs, propriétés, méthodes et signaux. |
| |
Les widgets sont les éléments fondamentaux de la création d'une application d'interface utilisateur graphique (GUI) GTK4. Ce sont des éléments d'interface utilisateur prédéfinis, tels que des étiquettes, des entrées de texte et des boutons. GtkWidget est la classe de base de tous les widgets. Chaque widget dérive de GtkWidget. Il fournit un ensemble commun de propriétés, de méthodes et de signaux pour garantir la cohérence et le style des widgets. | Les widgets sont les éléments fondamentaux de la création d'une application d'interface utilisateur graphique (GUI) GTK4. Ce sont des éléments d'interface utilisateur prédéfinis, tels que des étiquettes, des entrées de texte et des boutons. GtkWidget est la classe de base de tous les widgets. Chaque widget dérive de GtkWidget. Elle fournit un ensemble commun de propriétés, de méthodes et de signaux pour garantir la cohérence et le style des widgets. |
| |
| |
Les informations de l'API GTK4 sont une ressource essentielle pour le développement d'une application GTK. Elles fournissent des informations sur les constructeurs, les propriétés, les méthodes et les signaux d'un objet. Consultez le lien externe de l'API GTK4 ci-dessous. Les propriétés représentent les données ou l'état d'un objet. Les méthodes sont des fonctions associées à un objet. Les signaux informent le programme qu'un événement est survenu sur l'objet et sont systématiquement connectés à des fonctions de rappel pour déclencher l'action appropriée. La macro de fonction g_signal_connect() permet de connecter une fonction de rappel à un signal pour un objet particulier. | Les informations de l'API GTK4 sont une ressource essentielle pour le développement d'une application GTK. Elles fournissent des informations sur les constructeurs, les propriétés, les méthodes et les signaux d'un objet. Consultez le lien externe de l'API GTK4 ci-dessous. Les propriétés représentent les données ou l'état d'un objet. Les méthodes sont des fonctions associées à un objet. Les signaux informent le programme qu'un événement est survenu sur l'objet et sont systématiquement connectés à des fonctions de rappel pour déclencher l'action appropriée. La macro de fonction g_signal_connect() permet de connecter une fonction de rappel à un signal pour un objet particulier. |
| |
Par exemple, les informations de l'API sur la classe button révèlent qu'elle possède un constructeur appelé gtk_button_new_with_label(), une propriété appelée has-frame et un signal appelé « clicked ». Le signal « clicked » est émis lorsque le bouton est enfoncé puis relâché (activé). La propriété has-frame possède des méthodes getter et setter appelées respectivement gtk_button_get_has_frame() et gtk_button_set_has_frame(). | Par exemple, les informations de l'API sur la classe button révèlent qu'elle possède un constructeur appelé gtk_button_new_with_label(), une propriété appelée has-frame et un signal appelé « clicked ». Le signal « clicked » est émis lorsque le bouton est enfoncé puis relâché (activé). La propriété has-frame possède des méthodes getter (récupérer une valeur) et setter (définir une valeur) appelées respectivement gtk_button_get_has_frame() et gtk_button_set_has_frame(). |
| |
| |
Installer GTK4 | Installer GTK4 |
| |
Pour créer des applications GTK à partir des sources, il est nécessaire d'installer le paquet libgtk-4-dev, qui contient les fichiers d'en-tête et de développement de la bibliothèque GTK4. L'installation de ce paquet libgtk-4-dev s'accompagne de l'installation d'autres bibliothèques, telles que GLib et Gio. GLib propose diverses structures de données, ainsi que des fonctions de manipulation de chaînes et de gestion de fichiers, couramment utilisées en programmation C. La bibliothèque Gio fournit des classes pour les entrées/sorties générales, la mise en réseau et la prise en charge de D-bus. Le méta-paquet build-essential est également requis. Il contient un ensemble d'outils logiciels et de bibliothèques essentiels à la création et à la compilation d'applications à partir du code source. Il comprend notamment la collection de compilateurs GNU (GCC) pour la programmation C et C++, ainsi que GNU Make, un outil d'automatisation de la compilation permettant de gérer le processus de compilation d'un projet. | Pour créer des applications GTK à partir des sources, il est nécessaire d'installer le paquet libgtk-4-dev, qui contient les fichiers d'en-tête et de développement de la bibliothèque GTK4. L'installation de ce paquet libgtk-4-dev s'accompagne de l'installation d'autres bibliothèques, telles que GLib et Gio. GLib propose diverses structures de données, ainsi que des fonctions de manipulation de chaînes et de gestion de fichiers, couramment utilisées en programmation C. La bibliothèque Gio fournit des classes pour les entrées/sorties générales, la mise en réseau et la prise en charge de D-bus. Le méta-paquet build-essential est également requis. Il contient un ensemble d'outils logiciels et de bibliothèques essentiels à la création et à la compilation d'applications à partir du code source. Il comprend notamment la collection de compilateurs GNU (GCC) pour la programmation en C et C++, ainsi que GNU Make, un outil d'automatisation de la compilation permettant de gérer le processus de compilation d'un projet. |
| |
Sous Ubuntu 24.04, les paquets suivants doivent être installés à l'aide des commandes de terminal ci-dessous. | Sous Ubuntu 24.04, ces paquets doivent être installés à l'aide des commandes de terminal ci-dessous. |
| |
sudo apt update | sudo apt update |
Première application | Première application |
| |
Ouvrez le fichier main.c du téléchargement. Il explique comment utiliser GTK4 pour créer une fenêtre contenant des widgets d'étiquettes et de boutons positionnés à l'aide d'un conteneur de mise en page de boîte. Un programme GTK4 doit commencer par la directive #include <gtk/gtk.h>. Celle-ci inclut tous les widgets, variables, fonctions et structures disponibles dans la boîte à outils GTK4, ainsi que les fichiers des autres bibliothèques dont GTK4 dépend. | Dans le téléchargement, ouvrez le fichier main.c. Il explique comment utiliser GTK4 pour créer une fenêtre contenant des widgets d'étiquettes et de boutons positionnés à l'aide d'un conteneur de mise en page de boîte. Un programme GTK4 doit commencer par la directive #include <gtk/gtk.h>. Celle-ci inclut tous les widgets, variables, fonctions et structures disponibles dans la boîte à outils GTK4, ainsi que les fichiers des autres bibliothèques dont GTK4 dépend. |
| |
La fonction main est le point d'entrée du programme et permet de créer et d'exécuter un objet GtkApplication. Le pointeur appelé « app » est déclaré et initialisé à l'aide du constructeur gtk_application_new(). La macro de fonction g_signal_connect() connecte le signal « activate » à la fonction activate(). Le signal activate est émis au démarrage de l'application avec g_application_run() qui prend les arguments de la ligne de commande. La méthode g_object_unref() est appelée sur le pointeur d'application GtkApplication à la fermeture de l'application. | La fonction main est le point d'entrée du programme et permet de créer et d'exécuter un objet GtkApplication. Le pointeur appelé « app » est déclaré et initialisé à l'aide du constructeur gtk_application_new(). La macro de fonction g_signal_connect() connecte le signal « activate » à la fonction activate(). Le signal activate est émis au démarrage de l'application avec g_application_run() qui prend les arguments de la ligne de commande. La méthode g_object_unref() est appelée sur le pointeur d'application GtkApplication à la fermeture de l'application. |
gtk_window_set_title (GTK_WINDOW (window), "Hello Window"); | gtk_window_set_title (GTK_WINDOW (window), "Hello Window"); |
gtk_window_set_default_size (GTK_WINDOW (window),400, 100); | gtk_window_set_default_size (GTK_WINDOW (window),400, 100); |
label =gtk_label_new("GTK4 Programming in C"); | label =gtk_label_new("Programmation GTK4 en C"); |
box =gtk_box_new(GTK_ORIENTATION_VERTICAL,1); | box =gtk_box_new(GTK_ORIENTATION_VERTICAL,1); |
gtk_window_set_child (GTK_WINDOW (window), box); | gtk_window_set_child (GTK_WINDOW (window), box); |
button = gtk_button_new_with_label ("Click Me"); | button = gtk_button_new_with_label ("Cliquez-moi"); |
gtk_button_set_has_frame(GTK_BUTTON(button),FALSE); | gtk_button_set_has_frame(GTK_BUTTON(button),FALSE); |
g_signal_connect (GTK_BUTTON (button),"clicked", G_CALLBACK (button_clicked),label); | g_signal_connect (GTK_BUTTON (button),"cliqué", G_CALLBACK (button_clicked),label); |
gtk_box_append(GTK_BOX(box), label); | gtk_box_append(GTK_BOX(box), label); |
gtk_box_append(GTK_BOX(box), button); | gtk_box_append(GTK_BOX(box), button); |
Dans la fonction activate(), une fenêtre GTK est créée à l'aide du constructeur gtk_application_window_new(). Le titre de la fenêtre, « Hello Window », est défini à l'aide de gtk_window_set_title(). En GTK, GTK_WINDOW() est une macro qui convertit un pointeur GtkWidget en pointeur GtkWindow par conversion de type. La taille de la fenêtre est définie à l'aide de gtk_window_set_default_size() et une fenêtre est affichée à l'aide de gtk_window_present(). | Dans la fonction activate(), une fenêtre GTK est créée à l'aide du constructeur gtk_application_window_new(). Le titre de la fenêtre, « Hello Window », est défini à l'aide de gtk_window_set_title(). En GTK, GTK_WINDOW() est une macro qui convertit un pointeur GtkWidget en pointeur GtkWindow par conversion de type. La taille de la fenêtre est définie à l'aide de gtk_window_set_default_size() et une fenêtre est affichée à l'aide de gtk_window_present(). |
| |
Les pointeurs GtkWidget de bouton, d'étiquette et de boîte sont déclarés. Le widget d'étiquette est créé à l'aide du constructeur gtk_label_new() et son texte est défini à « Programmation GTK4 en C ». Le widget de bouton est créé à l'aide du constructeur gtk_button_new_with_label() et son texte est défini à « Cliquez sur moi ». Le conteneur de mise en page de la boîte est créé à l'aide du constructeur gtk_box_new(). Son orientation est verticale et permet d'organiser les widgets enfants (par exemple, l'étiquette et le bouton dans cet exemple). La méthode gtk_box_append() permet d'ajouter l'étiquette, puis le bouton, au conteneur de la boîte. La fonction gtk_window_set_child() permet d'ajouter la boîte à la fenêtre. | Les pointeurs GtkWidget de bouton, d'étiquette et de boîte sont déclarés. Le widget d'étiquette est créé à l'aide du constructeur gtk_label_new() et son texte est défini à « Programmation GTK4 en C ». Le widget de bouton est créé à l'aide du constructeur gtk_button_new_with_label() et son texte est défini à « Cliquez-moi ». Le conteneur de mise en page de la boîte est créé à l'aide du constructeur gtk_box_new(). Son orientation est verticale et permet d'organiser les widgets enfants (par exemple, l'étiquette et le bouton dans notre cas). La méthode gtk_box_append() permet d'ajouter l'étiquette, puis le bouton, au conteneur de la boîte. La fonction gtk_window_set_child() permet d'ajouter la boîte à la fenêtre. |
| |
| |
There are macros similar to GTK_LABEL for almost every widget such GTK_ENTRY(object) which casts the object to GtkEntry*. A GtkEntry allows a user to input and edit a single line of text. These macros are a cornerstone of how GTK implements object oriented programming and type safety in the C language.** | There are macros similar to GTK_LABEL for almost every widget such GTK_ENTRY(object) which casts the object to GtkEntry*. A GtkEntry allows a user to input and edit a single line of text. These macros are a cornerstone of how GTK implements object oriented programming and type safety in the C language.** |
| |
La propriété du bouton « has-frame » est définie sur FALSE à l'aide de la fonction de définition gtk_button_set_has_frame(). Ensuite, g_signal_connect() est utilisée pour connecter une fonction de rappel appelée button_clicked() au signal « clicked » du bouton. Les arguments de la fonction de rappel de clic du bouton sont le GtkButton et un gpointer. Un gpointer (pointeur générique) est un pointeur non typé, ce qui signifie qu'il n'est associé à aucun type de données et nécessite donc un transtypage. Il doit être explicitement transtypé vers le type de pointeur spécifique approprié, sinon le compilateur ne sait pas comment l'interpréter. Dans ce cas, le gpointer est le widget d'étiquette. Dans la fonction de rappel, la macro GTK_LABEL() convertit le pointeur d'étiquette GtkWidget obtenu à partir des données utilisateur du gpointer en GtkLabel. La méthode gtk_label_set_text() définit ensuite le texte de l'étiquette à « Button Clicked ». Lorsqu'un utilisateur clique sur le bouton, le texte de l'étiquette devient « Bouton cliqué ». | La propriété du bouton « has-frame » est définie sur FALSE à l'aide de la fonction de définition gtk_button_set_has_frame(). Ensuite, g_signal_connect() est utilisée pour connecter une fonction de rappel appelée button_clicked() au signal « clicked » du bouton. Les arguments de la fonction de rappel de clic du bouton sont le GtkButton et un gpointer. Un gpointer (pointeur générique) est un pointeur non typé, ce qui signifie qu'il n'est associé à aucun type de données et nécessite donc un transtypage. Il doit être explicitement transtypé vers le type de pointeur spécifique approprié, sinon le compilateur ne sait pas comment l'interpréter. Dans ce cas, le gpointer est le widget d'étiquette. Dans la fonction de rappel, la macro GTK_LABEL() convertit le pointeur d'étiquette GtkWidget obtenu à partir des données utilisateur du gpointer en GtkLabel. La méthode gtk_label_set_text() définit ensuite le texte de l'étiquette à « cliqué ». Lorsqu'un utilisateur clique sur le bouton, le texte de l'étiquette devient « cliqué ». |
| |
Il existe des macros similaires à GTK_LABEL pour presque tous les widgets, comme GTK_ENTRY(object) qui convertit l'objet en GtkEntry*. Une GtkEntry permet à l'utilisateur de saisir et de modifier une seule ligne de texte. Ces macros sont essentielles à la mise en œuvre par GTK de la programmation orientée objet et de la sécurité des types en langage C. | Il existe des macros similaires à GTK_LABEL pour presque tous les widgets, comme GTK_ENTRY(object) qui convertit l'objet en GtkEntry*. Une GtkEntry permet à l'utilisateur de saisir et de modifier une seule ligne de texte. Ces macros sont essentielles à la mise en œuvre par GTK de la programmation orientée objet et de la sécurité des types en langage C. |
GNU Make est un outil d'automatisation de la compilation qui gère le processus de compilation d'un projet. L'objectif général est de créer un Makefile pour compiler l'exécutable du projet avec les bibliothèques et les en-têtes GKT4. Make et d'autres systèmes de compilation sont utilisés en développement logiciel car ils ne recompilent les fichiers qu'en cas de modifications, ce qui est important pour les projets volumineux comportant de nombreux fichiers de code source. Une explication du Makefile de ce projet GTK4 est disponible dans le téléchargement du code ; seule son utilisation est donc abordée ici. | GNU Make est un outil d'automatisation de la compilation qui gère le processus de compilation d'un projet. L'objectif général est de créer un Makefile pour compiler l'exécutable du projet avec les bibliothèques et les en-têtes GKT4. Make et d'autres systèmes de compilation sont utilisés en développement logiciel car ils ne recompilent les fichiers qu'en cas de modifications, ce qui est important pour les projets volumineux comportant de nombreux fichiers de code source. Une explication du Makefile de ce projet GTK4 est disponible dans le téléchargement du code ; seule son utilisation est donc abordée ici. |
| |
Pour utiliser le Makefile afin de compiler le projet de démonstration, ouvrez un terminal dans le répertoire du projet et exécutez la commande « make ». L'avantage de GNU Make est qu'une seule commande suffit pour compiler le projet. | Pour utiliser Makefile afin de compiler le projet de démonstration, ouvrez un terminal dans le répertoire du projet et exécutez la commande « make ». L'avantage de GNU Make est qu'une seule commande suffit pour compiler le projet. |
| |
make | make |
| |
Le Makefile contient une cible appelée « clean » qui supprime l'exécutable et tous les fichiers objets afin qu'une nouvelle compilation puisse être effectuée à partir des fichiers sources intacts. L'exécution de « make clean » en ligne de commande supprime le fichier objet et l'exécutable. | Le Makefile contient une cible appelée « clean » qui supprime l'exécutable et tous les fichiers objets afin qu'une nouvelle compilation puisse être effectuée à partir des fichiers sources intacts. L'exécution de « make clean » en ligne de commande supprime le fichier objet et l'exécutable. |
| |
| |
**External links | **External links |