Indice

Introduzione allo sviluppo multipiattaforma con WxWidgets su Gnu/Linux

Autore: Fabio Di Matteo
Ultima revisione: 28/11/2023 - 09:52

Archivio completo con i sorgenti: test.zip

WxWidgets è una libreria per lo sviluppo di programmi ,dotati di interfaccia grafica, multipiattaforma. La libreria ha la particolarita' di usare i widget grafici nativi del sistema ospite in modo da integrare ,dal punto di vista grafico, maggiormente le applicazioni con il resto dell'interfaccia grafica.

Installazione wxwidget su Linux

Installare la libreria wxwidgets su linux non è affatto complicato, basta infatti usare il package manager della nostra distribuzione preferita einstallare i pacchetti.

Installazione per windows

Ho usato l'ambiente MSYS2 perfetto per lo scopo.

Creiamo la nostra gui

Per creare la nostra interfaccia grafica ho usato wxFormBuilder. Un pratico editor visuale per creare interfacce grafiche per wxWidgets. I passi da compiere per ottenere le classi base dalle quali otterremo le classi ereditate per creare i nostri widgets sono i seguenti:

  1. disegnare la nostra interfaccia;
  2. salvare il file di progetto .fbp
  3. nelle prprietà del progetto settare il path della cartella dove salvare le nostre classi (path relativo);
  4. dal menu “tools” selezionare “generate inerithed class”

Main.cc

Implemento la mia app, la quale caricherà i vari widgets una volta avviata.

// GUI Designer for wxWidgets using wxFormBuilder
// https://yasriady.blogspot.com/2015/08/gui-designer-for-wxwidgets-using_42.html
 
#include <wx/wxprec.h>
#ifndef WX_PRECOMP
    #include <wx/wx.h>
#endif
#include "gui/gui.h"
#include "MyFrame.h"
 
 
 
class MyApp: public wxApp
{
 
    virtual bool OnInit();
};
 
bool MyApp::OnInit()
{
    MyFrame *frame=new MyFrame(NULL); 
    frame->Show(true);
    return true;
}
 
 
 
//Implementa la main()
IMPLEMENT_APP(MyApp)

MyFrame.h

i file generati da wxFormBulder si trovano in una cartella chiamata “gui” relativa al progetto.

#ifndef __MyFrame__
#define __MyFrame__
 
/**
@file
Subclass of TMainFrame, which is generated by wxFormBuilder.
*/
 
#include "gui/gui.h"
 
//// end generated include
 
/** Implementing TMainFrame */
class MyFrame : public TMainFrame
{
	protected:
		// Handlers for TMainFrame events.
		void clicked( wxCommandEvent& event );
	public:
		/** Constructor */
		MyFrame( wxWindow* parent );
	//// end generated class members
 
};
 
#endif // __MyFrame__

MyFrame.cpp

#include "MyFrame.h"
 
MyFrame::MyFrame( wxWindow* parent )
:
TMainFrame( parent )
{
 
}
 
void MyFrame::clicked( wxCommandEvent& event )
{
	this->label->SetLabel(this->entry->GetValue());
}

Makefile

CPP = g++ 
OPTS =  `wx-config --cxxflags --libs`
 
all:
	make linux
 
linux:
	$(CPP) main.cc ./gui/gui.cpp MyFrame.cpp -o wxtest $(OPTS)
 
 
clean:
	rm wxtest

makefile con supporto a Windows

Questo makefile testato con msys2 compila staticamente wxwidgets e le librerie del g++ (standard, posix etc…).

CPP_unix = g++
OPTS_unix =  `wx-config --cxxflags --libs`
 
CPP_win64 = g++ -static
OPTS_win64 =  `wx-config --cxxflags --libs --static=yes`
 
all:
	make linux
 
linux:
	$(CPP_unix) main.cc ./gui/gui.cpp MyFrame.cpp -o wxtest $(OPTS_unix)
 
win:
	$(CPP_win64) main.cc ./gui/gui.cpp MyFrame.cpp -o wxtest $(OPTS_win64)
 
clean:
	rm wxtest.*

Per compilare staticamente su windows quindi digitare : make win