Chapitre 7. Générer la source (autre solution)

Sans utiliser le système de sous-classes de KDevelop

Etape 1 - Assurez vous d'enregistrer votre formulaire avec le nom sigcreatedlg.ui et de fermer Qt Designer. Si vous ouvrez ce fichier avec votre éditeur préféré vous verrez qu'il ne s'agit pas de C++ mais de code XML. Un outil de ligne de commandes spécial appelé uic est fourni avec Qt Designer. Cette commande est utilisée pour convertir les fichiers .ui en .h et .cpp. Cette convertion est gérer automatiquement par KDevelop.

Note

Si pour une raison ou pour une autre KDevelop ne génère pas le .h et .cpp à partir de sigcreatedlg.ui, voici les deux commandes que vous pouvez utiliser dans la console pour le faire manuellement, dans ~/sigcreate/src:
uic -o sigcreatedlg.h sigcreatedlg.ui
uic -o sigcreatedlg.cpp -i sigcreatedlg.h sigcreatedlg.ui

Etape 2 - Vous devez maintenant rattahcer la classe que KDevelop vous a généré (SigCreate) depuis cette nouvelle fenêtre Qt Designer. Dans KDelevlop, visualiez le fichier sigcreate.h en le sélectionnant dans le Sélecteur de fichier et ajouter :

#include "sigcreatedlg.h"
en haut du fichier, avec les en têtes dont vous avez besoin.
 #include <kapplication.h>
 #include <qwidget.h>
 #include <qlineedit.h>
 #include <qmultilineedit.h>
 #include <qcombobox.h>
 #include <sigcreatedlg.h>

 /** SigCreate is the base class of the project */
 class SigCreate : public SigCreateDlg
 {
 
Remplacez public KMainWindow par public SigCreateDlg puisque SigCreate est rattaché à SigCreateDlg.

Vous devez avoir les lignes suivantes dans sigcreate.h :

 class SigCreate : public SigCreateDlg  {
    Q_OBJECT
 public:
         /** constructor */
        SigCreate(QWidget *parent=0, const char *name=0);
          /** destructor */
        ~SigCreate();
 };
 
Le fichier sigcreate.cpp doit ressembler à ça :
 #include "sigcreate.h"

 SigCreate::SigCreate(QWidget *parent, const char *name) : SigCreateDlg(parent, name)
 {
 }

 SigCreate::~SigCreate()
 {
 }
 
Etape 3 - Il faut ajouter également les fichiers includes. Dans sigcreate.h, ajoutez les trois en têtes, un par classe :
 #include <qlineedit.h>
 #include <qcombobox.h>
 #include <qmultilineedit.h>
Etape 4 - Décommenter quelques lignes dans main.cpp :
   /* if (app.isRestored())
    {
        RESTORE(SigCreate);
    }
    else*/
étant donné que le projet se base sur un modèle KMainWindow qui permet de faire pas mal de choses.

Note

Comme ce programme est fait pour un tutoriel, il ne reflète pas ce à quoi vous serez confronté. Ce que vous devriez faire après avoir inclus le fichier .ui est de créer une nouvelle classe SigCreate. Pour ce faire, cliquez-droit sur Classes, sélectionner une nouvelle classe... et la fenêtre de génération de classes apparaît. Entrez le nom de la classe (SigCreate) et le nom de la classe principale (SigCreateDlg). N'oubliez pas de cocher le choix "générer un QWidget-childclass". Puis cliquez sur OK. Nous ne suivons pas cette étape si la classe SigCreate est notre fenêtre principale.

Avertissement

La classe dérivée ne peut pas être nommé .ui. A partir du fichier .ui, un fichier .ccp, .h sont générés automatiquement donc il faut impérativement avoir des noms différents. Vous pouvez indiquer un fichier interface en précisant dlg dans son nom. La classe dérivée .ui peut par exemple avoir comme nom mainWindowDlg.

Vous pouvez exécuter le projet pour voir si tout va bien. Choisissez Construire -> Exécuter automake & friends, puis construire, exécuter configure, et Construire->Construire le projet et Construire-> Installer (ou Installer en tant que root) puis Construire -> Execute Program (ou le raccourci) F9). Notez que selon votre configuration, vous pourrez très bien faire Construire->Installer en tant que root au lieu de Construire-> Installer si l'utilisateur n'a pas les droits d'écriture du répertoire KDEDIR. Vous pouvez également passer l'étape d'installation, fonctionnant pour ce tutoriel, mais peut générer des problèmes sur un véritable programme. L'interface devrait apparaître, mais le bouton Créer ! ne fonctionne pas pour l'instant. On peut le rajouter en implémentant le slot slotCreateSig(). Voir la figure 19.

Si vous obtenez l'erreur suivante en compilant : Syntax error before `{' token" referring to the opening brace right /before/ the Q_OBJECT line in sigcreate.h, c'est que vous avez oublié de rajouter

#include "sigcreatedlg.h"
ou le fichier sigcreatedlg.h n'est pas créé (voir note ci dessus).


Le programme
Figure 19: Presque terminé