# 4.2. Créer vos propres Vues

Maintenant que vous avez une vision globale de ce qui est déjà fourni, vous pourrez remarquer que pour beaucoup de types d'utilisation, des widgets existent déjà et sont prêts à l'emploi ou peuvent être combinés ensemble. KMail, ainsi que KDevelop lui-même utilisent des composants de bibliothèques de vues pour afficher leurs données.

Pour les applications qui utilisent un format de fichier spécial ou qui doivent utiliser des fonctions graphiques, vous serez probablement forcé de créer votre propre widget de vue pour manipuler les données. Cela est réalisé dans notre exemple par la classe `KScribbleView` qui fournit déjà une zone de vue de base.

Hériter de `QWidget` est nécessaire pour surcharger les méthodes virtuelles afin de traiter les événements utilisateur, c'est probablement le travail le plus long, au-delà de fournir les menus popups pour accéder facilement à certaines fonctions. Il paraît également judicieux d'implanter un ensemble de slots auxquels on peut accéder grâce aux boutons de la barre d'outils ou aux commandes de la barre de menus pour s'y connecter, ainsi que des méthodes pour manipuler des variables comme, par exemple, une couleur de dessin.

Afin d'être complets, nous allons répéter les méthodes nécessaires :

a) Événements Clavier -- les touches TAB et Shift-TAB :

changent le focus d'entrée du clavier du widget courant vers le widget suivant dans l'ordre du focus. Le focus peut être donné aux widgets en appelant `setFocusPolicy()` et en traitant les événements suivants :

- `virtual void focusInEvent ( QFocusEvent * )`

- `virtual void focusOutEvent ( QFocusEvent * )`

b) toute autre saisie au clavier :

- `virtual void keyPressEvent ( QKeyEvent * )`

- `virtual void keyReleaseEvent ( QKeyEvent * )`

c) mouvements de la souris :

- `virtual void mouseMoveEvent ( QMouseEvent * )`

- `virtual void enterEvent ( QEvent * )`

- `virtual void leaveEvent ( QEvent * )`

d) actions des boutons de la souris :

- `virtual void mousePressEvent ( QMouseEvent * )`

- `virtual void mouseReleaseEvent ( QMouseEvent * )`

- `virtual void mouseDoubleClickEvent ( QMouseEvent * )`

e) événements de la fenêtre contenant le widget :

- `virtual void moveEvent ( QMoveEvent * )`

- `virtual void resizeEvent ( QResizeEvent * )`

- `virtual void closeEvent ( QCloseEvent * )`

En ré-implantant ces fonctions, vous devrez prendre garde à certains points pour éviter des erreurs d'implantation qui rendront impossible une modification ultérieure du comportement du widget :

1. déclarez vos méthodes virtuelles comme virtual et conservez l'accès "protégé" (NdT : protected). Cela permet de réutiliser le widget par héritage et conserve une certaine homogénéité& ;;

2. ne codez pas en dur un traitement d'événement qui devrait être configurable. Cela est d'autant plus vrai pour les événements du clavier qui pourraient être réalisés avec des raccourcis clavier si une fonction est appelée. Cela est même valable pour les traitements de texte ! (pensez que beaucoup d'utilisateurs sont habitués au comportement de leur éditeur favori. Si cela est configurable, ils pourront utiliser le comportement auquel ils sont habitués)& ;;

3. transmettez le "signal" de surbrillance (NdT : highlighting) des menus popups au widget principal pour activer l'aide dans la barre d'état.