Chapter 7. Generare il codice (alternativo)

Senza usare la capacità di subclassing di KDevelop

Passo 1 - Assicurati di aver salvato la form con il nome sigcreatedlg.ui e chiudi Qt Designer. Se apri questo file con il tuo editor preferito, noterai che non è codice C++, ma XML. Una linea di comando speciale chiamata uic è inclusa in Qt Designer. Questo comando viene usato per convertire il file .ui in files .h e .cpp. Questo passo viene svolto automaticamente da KDevelop.

Note

Se per qualche ragione KDevelop non dovesse generare i file .h e .cpp da sigcreatedlg.ui, ecco i due comandi che puoi lanciare nella Konsole per farlo manualmente, in ~/sigcreate/src:
uic -o sigcreatedlg.h sigcreatedlg.ui
uic -o sigcreatedlg.cpp -i sigcreatedlg.h sigcreatedlg.ui

Passo 2 - Devi ora derivare la classe che KDevelop ha generato per te (la classe SigCreate) dalla nuova classe creata con Qt Designer. All'interno di KDevelop, visualizza il file sigcreate.h selezionandolo nel File Selector e aggiungi

#include "sigcreatedlg.h"
all'inizio del file sigcreate.h, con tutti gli headers di cui hai bisogno.
 #include <kapplication.h>
 #include <qwidget.h>
 #include <qlineedit.h>
 #include <qmultilineedit.h>
 #include <qcombobox.h>
 #include <sigcreatedlg.h>

 /** SigCreate è la classe base del progetto */
 class SigCreate : public SigCreateDlg
 {
 
Sostituisci public KMainWindow con public SigCreateDlg in quanto SigCreate deriva da SigCreateDlg.

Dovresti avere le seguenti linee in sigcreate.h :

 class SigCreate : public SigCreateDlg  {
    Q_OBJECT
 public:
         /** constructor */
        SigCreate(QWidget *parent=0, const char *name=0);
          /** destructor */
        ~SigCreate();
 };
 
Il file sigcreate.cpp dovrebbe assomigliare al seguente:
 #include "sigcreate.h"

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

 SigCreate::~SigCreate()
 {
 }
 
Passo 3 - Devi anche aggiungere i file di include. In sigcreate.h, devi aggiungere i seguenti 3 headers, uno per ogni classe che abbiamo usato:
 #include <qlineedit.h>
 #include <qcombobox.h>
 #include <qmultilineedit.h>
Step 4 - Commenta alcune linee nel file main.cpp:
   /* if (app.isRestored())
    {
        RESTORE(SigCreate);
    }
    else*/
dato che il programma era stato creato per essere basato su di una KMainWindow, che offre molti strumenti.

Note

Dato che questo programma è stato pensato per un tutorial, non riflette il "vero" ciclo di sviluppo. Quello che avresti dovuto fare dopo aver incluso il file .ui è creare una nuova classe SigCreate. Per fare questo, fai destro-click su Classi, seleziona Nuova Classe... e la finestra di generazione delle classi viene visualizzata. Inserisci il nome della classe (SigCreate) e il nome della classe di base (SigCreateDlg). Non ti dimenticare di selezionare l'opzione "genera un QWidget-classefiglia". In seguito fai click su OK. Non abbiamo seguito i passi dato che la classe SigCreate è la nostra finestra principale.

Warning

La classe derivata non può essere chiamata come il file .ui. Dal file .ui, un file .cpp e uno .h sono automaticamente generati così che devono avere nomi diversi. Puoi indicare un file di interfaccia aggiungendo dlg al suo nome. La classe derivata .ui può per esempio essere chiamata mainWindowDlg.

Puoi quindi lanciare il progetto per controllare che tutto sia a posto. All'inizio Build->Run automake & friends, e poi Build-> Run configure e Build->Build Project e Build->Install (oppure Install as root user) e Build->Execute Program (oppure Shift+F9). Per favore ricordati che tu vorresti lanciare Build->Install as root user invece di Build->Install se il tuo user non avesse accesso alla tua KDEDIR. Puoi anche saltare il passo relativo all'installazione: è adatto al tutorial, ma non lo potrebbe essere nel modo reale. L'interfaccia dovrebbe apparire, ma il bottone 'Crea!' non funziona ancora. Per fare ciò, dobbiamo implementare lo slot slotCreateSig(). Guarda la figura 19 sotto.

Se dovessi ottenere il seguente errore durante la compilazione: Syntax error before `{' token" referring to the opening brace right /before/ the Q_OBJECT line in sigcreate.h, allora hai dimenticato di aggiungere

#include "sigcreatedlg.h"
oppure il file sigcreatedlg.h non è stato creato (cfr nota sopra).


The program
Figura 19: Quasi finito