Libreria Wxwidget

wxwidgets.org Vengono presentati tre esempi. Richiedono l'installazione delle librerie wxwidget, di codelite e di wxformbuilder

Comando per compilare il seguente codice sorgente

g++ gui1.cpp `wx-config --libs` `wx-config --cxxflags` -o gui1
gui1.h
#include <wx/app.h>
 
class MiaApp : public wxApp
{
public: 
   virtual bool OnInit();
};
 
DECLARE_APP(MiaApp) //vedi gui1.cpp
 
class MiaCornice : public wxFrame
{
public:
   MiaCornice(const wxString &title, const wxPoint &pos, const wxSize &size);
   /*~MiaCornice();*/
   void Uscire(wxCommandEvent& event);
 
protected:
   DECLARE_EVENT_TABLE() //vedi gui1.cpp
 
private:
   wxButton* b1;
 
};
gui1.cpp
#include <wx/wxprec.h>
#ifndef WX_PRECOMP
#       include <wx/wx.h>
#endif
 
#include "gui1.h"
 
BEGIN_EVENT_TABLE(MiaCornice,wxFrame) //associa ad ogni evento un metodo di getione
	EVT_BUTTON(1001,MiaCornice::Uscire)
END_EVENT_TABLE()
 
IMPLEMENT_APP(MiaApp) //crea il main e il metodo wxGetApp e fa inizializzazioni
 
bool MiaApp::OnInit()
{
   MiaCornice *finestra1 = new MiaCornice(_T("titolodellafinestra!"), wxDefaultPosition,wxSize(300, 200));
   finestra1->Show(true);
   //SetTopWindow(finestra1);
   return true;
}
 
MiaCornice::MiaCornice(const wxString& title, const wxPoint& pos, const wxSize& size): wxFrame((wxFrame *) NULL, -1, title, pos, size)
{
   b1 = new wxButton(this,1001,_T("pulsante....."),wxDefaultPosition, wxDefaultSize, 0);
}
 
void MiaCornice::Uscire(wxCommandEvent& event)
{
   Close(true);
}

Premessa

Con wxformbuilder costruisco solo la Classe Base per la finestra (MyFrame). Non devo modificare il codice generato da wxformbuilder (MyFrame.cpp) perché la classe base non deve contenere l'implementazione dei metodi (astratti).

Creo invece una classe Derivata (MiaCornice) a partire dalla classe Base creata da wxformbuilder (MyFrame) in modo che ne erediti tutti gli attributi e tutti i metodi. Poi implemento dentro la classe Derivata (MiaCornice) tutti i metodi di cui ho bisogno (per gestire gli eventi).

Esempio guidato

  1. aprire wxformbuilder
  2. (a destra) c'e' un progetto vuoto con delle propietà da modificare (a sinistra)
    • name: nome del progetto, a piacere…
    • path: cartella dove salva i file di codice generato automaticamente
    • file: nome del file che conterrà la classe Base (da NON modificare) es: MyFrame
    • namespace: a piacere MioNameSpace??? NON FUNZIONA???
  3. aprire la scheda Form
    • click prima icona a sinistra, crea una classe (NON UN OGGETTO) tipo wxFrame
    • (a destra) c'è un object (NON UN OGGETTO!) con delle proprietà da modificare (a sinistra)
    • name: a piacere es: MyFrame
    • title: testo sulla barra del titolo a piacere: Titolone blu
  4. scheda Layout
    • click prima icona a sinistra, crea un oggetto tipo wxBoxSizer
    • a destra c'è un oggetto, a sinistra le proprietà da modificare
    • name: a piacere es: myBSizer1
  5. Scheda Menu Toolbar
    • click prima icona a sinistra, crea un oggetto tipo wxStatusBar
    • a destra c'è un oggetto, a sinistra le proprietà da modificare
    • name: a piacere es: m_StatusBar1
    • fields: numero campi es: 2
  6. Scheda Menu Toolbar
    • click seconda icona a sinistra, crea un oggetto tipo wxMenuBar
    • a destra c'è un oggetto, a sinistra le proprietà da modificare
    • name: a piacere es: m_MenuBar1
    • label: non viene visualizzato??
  7. Scheda Menu Toolbar
    • click terza icona a sinistra, crea un oggetto tipo wxMenu
    • a destra c'è un oggetto, a sinistra le proprietà da modificare
    • name: a piacere es: m_Menu1
    • label: a piacere es: &File
  8. Scheda Menu Toolbar
    • click quinta icona a sinistra, crea un oggetto tipo wxMenuItem
    • a destra c'è un oggetto, a sinistra le proprietà da modificare)
    • name: a piacere es: m_MenuQuit
    • label: a piacere es: quit…
    • id: e' il nome di una costante, che viene automaticamente definita usando #define…
    • di questo oggetto di devono modificare anche gli events(a sinistra): OnMenuSelect Uscire (Cioè si indica solo il nome del metodo, senza parametri)
  9. premere F6
    • selezionare la classe Base (MyFrame)
    • indicare il nome della futura classe derivata (MiaCornice)
    • indicare il nome del file (MiaCornice)
    • Generare il codice della classe DERIVATA nella cartella scelta al punto 2
  10. premere F8
    • Generare il codice della classe BASE nella cartella scelta al punto 2
  11. salvare e uscire
  12. creare main.cpp e main.h
    • dentro main.cpp si deve scrivere una macro che sostituisce il main() e creare l'oggetto finestra1 dentro il costruttore MiaApp::MiaApp()
    • dentro main.h si deve scrivere una macro e includere gli altri file.h
  13. editare MiaCornice.cpp
    • dentro cui bisogna solo implementare i metodi (Uscire) con il suggerimento TO DO..
  14. per compilare tutto, eseguire il comando
    •  g++ main.cpp MiaCornice.cpp MyFrame.cpp `wx-config --libs` `wx-config --cxxflags` 

codice1.zip

Legenda delle icone

  • cartella blu: workspace
  • cartella gialla: project
  • cartella marrone: virtual folder

Esempio

  1. Aprire codelite
  2. nel menu Workspace
    • new workspace (selezionare checkbox “separate directory”)
    • new project (selezionare GUI wxFrame e selezionare checkbox “separate directory”)
    • espandere le cartelle virtuali ed aprire gui.cpp e gui.h
  3. nella virtual folder RESOURCE (marrone)
    • tasto destro sul file gui.fbp (open with wxformbuilder)
    • versione diversa…? risposta: yes!
  4. dentro wxformbuilder
    • si potrebbe non modificare nulla
    • attenzione a NON modificare il nome del progetto (gui)
    • del progetto si può modificare la proprietà “event_generation TABLE”
    • attenzione a NON modificare il nome del Frame (MainFrameBase)
    • Ogni elemento a cui verrà associato un evento dovrà avere un ID unico: modificare wxID_ANY sostituendolo con una cosa a piacere (Esempio: wxID_MYBUTTON1)
    • modificare poi quello tutto che si desidera…
    • salvare il progetto
    • il codice autogenerato da wxformbuilder (gui.cpp, gui.h) è diverso da quello di codelite
    • esportarlo sovrascrivendo i file originali (premendo F8)
    • leggi sulla barra di stato: code generated!
    • Generare una classe derivata premendo F6: importante usare questi nomi (MainFrame, mainframe)
    • chiudere wxformbuilder
  5. di nuovo dentro codelite
    • se gui.cpp era stato aperto, codelite si accorge delle modifiche, chiederà: reload modified file? (ok!)
    • tasto destro sul project (giallo) > Import Files from Dir
    • correggere il percorso e selezionare la check box (non è mai selezionata)
  6. gui.cpp e gui.h DO NOT MODIFY…
  7. main.h (per capire confrontarlo con mainframe.h)
    • cancellare sotto
      //main application frame declaration// 

      ECCETTO

      #end_if

      perché quel codice si trova già in mainframe.h

    • sostituire
      #include "gui.h"

      con

      #include "mainframe.h"

      perché la classe dentro gui.h è solo la classe base.

  8. main.cpp
    • cancellare 4 elementi in fondo: costruttore, distruttore e due metodi (ora si trovano in mainframe.cpp) perché si trovano in mainframe.cpp
  9. mainframe.h
    • niente da fare
  10. mainframe.cpp
    • il costruttore viene completamente ereditato (rimane vuoto)
    • implementare SOLO quello che è suggerito dal commento
      //TO DO// 
    • NB: per esempio, per chiudere la finestra usare Destroy();
  11. Compilazione
    • Prima di compilare assicurarsi di NON essere in debug, ma in release.
    • premere F7 (build)
    • viene creata la cartella RELEASE contenente i file oggetto
    • l'eseguibile ha il nome del Project
    • premere CTRL+F5 (Run)
    • la modalità Debug produce errore su debian e ubuntu: in casi disperati usare gdb

codice4.zip

  • appunti3s/libreria_wxwidget.txt
  • Last modified: 2018/04/25 07:55
  • (external edit)