Les Widgets
Avant de passer à la pratique, il va falloir que je vous explique certaines choses sur le fonctionnement des objets GTK (boutons, menus, etc...).
Lorsque vous développerez des applications avec GTK, les
objets que vous mettrez dans vos fenêtres (je ne sais pas trop comment les appeler autrement que par leur vrai nom) sont appelés
WIDGETS. Il n'existe pas de sens
exact pour ce mot (sens général, bien sûr), mais en cherchant un peu, vous trouverez différentes définitions, voici quelques explications :
- De l'anglais : machin, chose, gadget.
- Gadget de Dashboard sous mac OSX Tiger.
- Plus interéssant : WInDow gadGET ou élément d'une interface graphique.
Je pense que vous commencez à comprendre de quoi il s'agit !!!

En gros,les widgets sont les boutons, les zones de texte, les menus, enfin.. à peu près
tout ce qui constitue une interface !
Quelques bases
- Il existe des types différents (ce sont des structures) pour chaque type de widget. Cependant, on ne les utilise que dans des cas particuliers et on utilisera la plupart du temps le type "widget" pour stocker les objets.
- Les noms des fonctions ont une syntaxe particulière, ils sont de la forme gtk_widget_action(...). C'est cela dans la plupart des cas avec GTK.
On remplace :
- widget par le type de widget sur lequel on travaille (ex : window pour une fenêtre).
- action par ce que la fonction est sensée effectuer (ex : set_title pour définir un titre)
C'est très facile à comprendre, vous ne devriez pas avoir de problème avec ça !
L'héritage
Après les Widgets, il y a une autre notion à connaitre avant de commencer, l'
héritage ! Si vous faites du C++, vous devriez savoir ce que c'est car c'est le but du C++ : l'héritage et l'orienté objet ! Mais nous travaillerons en C et GTK introduit une notion d'héritage.
Il faut que vous sachiez qu'il existe une hiérarchie entre les différents Widgets : il y a des groupes qui contiennent plusieurs widgets, la possibilité qu'un widget en contienne un autre, etc. L'héritage de GTK y est directement lié !
Un exemple concret
Je vais vous expliquer l'héritage avec un exemple :
Une fenêtre.
Je vous ai expliqué que pour créer un objet, on déclare un widget puis on y stocke un objet quelconque.
Une fenêtre est donc avant tout un Widget.
Citation : Hiérarchie des objetsWidget -> fenêtre
Maintenant, imaginons que je veuille créer une boîte de dialogue. Une boîte de dialogue c'est quoi ? En y réfléchissant un peu, on s'aperçoit que
c'est aussi une fenêtre ! On y a apporté des modifications mais c'est une fenêtre. On va donc descendre d'un cran pour dire qu'elle est particulière :
Citation : Hiérarchie des objetsWidget -> Fenêtre -> Boîte_de_dialogue
Petit point de vocabulaire : On dit que
BOITE_DE_DIALOGUE dérive de FENETRE (retenez bien le terme de
dériver). Dans la réalité, l'architecture est bien plus compliquée, mais d'un point de vue théorique, c'est exactement ça !
A quoi ça sert ?
L'intérêt de tout ça ? Il est simple.
Un premier exemple : Pour créer une boite de dialogue, les développeurs de GTK se sont dit : "On a créé une fenêtre, y'a plus qu'à la modifier !". La fonction qui crée une boite de dialogues appelle la fonction qui crée une fenêtre, puis modifie certains paramètres pour en faire une boite de dialogues.
Un peu de pseudo-code C :
Code : C1
2
3
4
5
6
7
8
9 | Widget* nouvelle_boite_dialogue(void)
{
Widget * fenetre = nouvelle_fenetre();
/* On change la taille, on ajoute du texte et des boutons, ..
pour faire une boite de dialogue */
return fenetre;
}
|
Un deuxième exemple : Les developpeurs de GTK ont programmé une fonction pour définir le titre d'une fenêtre. Mais pour une boite de dialogue ?
Se sont-ils
ennuyés à refaire
la même fonction (car une boîte de dialogue a la même structure qu'une fenêtre) pour une boîte de dialogue ? Et donc avoir deux fonctions identiques pour deux objets similaires ? ... NON !
Tout simplement, vous utiliserez sur
BOITE_DE_DIALOGUE une fonction faite pour
FENETRE, ce qui ne pose aucun problème puisque
BOITE_DE_DIALOGUE dérive de FENETRE.
Concluez que
vous pouvez utiliser sur un widget les fonctions des widgets parents.

(dans la plupart des cas)
_ _ _ _ _ _ _ _ _ _ _ _ _
Voilà à quoi sert l'héritage, à minimiser le nombre de fonctions pour des choses identiques. Si, ça reste assez flou pour vous, méditez bien là-dessus jusqu'à ce que vous ayez bien compris, c'est très important !
