segunda-feira, 11 de abril de 2011

Primeiro programa com wxWidgets

Introdução
    wxWidgets é uma biblioteca de classes para criar aplicações com interface gráfica em C++, mas, além de criação de interface gráfica, esta biblioteca provê também classes para manipulação de streams, banco de dados, threads, etc.  É uma biblioteca de código aberto e multiplataforma, funciona na maioria dos sistemas operacionais como: Windows, Linux, Mac, etc.  Seu projeto foi iniciado em 1992 por Julian Smart.

Instalação
  •    Linux:
             Faça download do wxGTK em: http://www.wxwidgets.org/downloads/
             Vá ao terminal e digite:
             cd /caminho/wxGTK-2.8.x (o caminho onde você extraiu o pacote)
             mkdir gtk-build
             cd gtk-build
             ../configure --enable-unicode --with-opengl --disable-shared
             make
             sudo make install
             Para testar a instalação digite: wx-config --version
             Para desenvolver seus programas eu recomendo a utilização da IDE Code::Blocks que pode ser baixada em:  http://www.codeblocks.org/downloads
             Se você prefere compilar seus programas pela linha de comando faça da seguinte maneira:
             g++ `wx-config --cppflags` `wx-config --libs` programa.cpp            

  • Windows
         Para Windows eu recomendo a utilização da IDE wxDev-cpp. Tudo o que você tem a fazer é baixar a IDE em: http://wxdsgn.sourceforge.net/?q=node/4 e instalá-la. O instalador da IDE faz todo trabalho de instalação da wxwidgets pra você.
 

Primeiro Programa
    No nosso primeiro programa vamos simplesmente criar uma janela com um texto no centro e um botão que ao ser clicado finaliza a aplicação.




Segue abaixo o código.


#include <wx/wx.h>
//frame.h

class MeuFrame : public wxFrame {
        private:
            wxPanel *painel;
            wxButton *btnsair;
            wxStaticText *label;
        public:
            MeuFrame(const wxString &titulo);
            void Sair(wxCommandEvent &evt);
};

#include "frame.h"
//frame.cpp

MeuFrame::MeuFrame(const wxString& titulo):
          wxFrame(NULL, wxID_ANY, titulo, wxDefaultPosition, wxSize(500, 400))
{
     //cria-se o widget wxPanel que fica dentro de um wxFrame
     painel = new wxPanel(this, wxID_ANY);
     //cria-se o widget wxStaticText que fica dentro do panel
     label = new wxStaticText(painel, -1, wxT("Meu Primeiro Programa com wxWidgets"), wxPoint(100, 200));
     //cria-se o widget wxButton que fica dentro do panel
     //wxPoint inica as coodenadas do botão dentro do painel e wxSize seu tamanho
     btnsair = new wxButton(painel, wxID_EXIT, wxT("Sair"), wxPoint(200, 250), wxSize(50, 30));
     //conecta-se o evento wxEVT_COMMAND_BUTTON_CLICKED ao método sair da classe   //MeuFrame
     //passando como parametro o ID do botão clicado
     Connect(wxID_EXIT, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MeuFrame::Sair));
     //atribui-se o foco ao botão sair
     btnsair->SetFocus();
     //centraliza o Frame na tela
     Centre();
}

void MeuFrame::Sair(wxCommandEvent &evt) {
    //fecha a aplicação
    Close(true);
}

#include <wx/wx.h>
//main.h
class MinhaApp : public wxApp {
    public:
        virtual bool OnInit();
};

#include "main.h"
#include "frame.h"
//main.cpp
//A macro que implementa a aplicação
IMPLEMENT_APP(MinhaApp)

bool MinhaApp::OnInit()
{
    //criamos o Frame passando o titulo da aplicação para o construtor
    MeuFrame *frame = new MeuFrame(wxT("Primeiro Programa com wxWidgets"));
    //mostramos o frame na tela
    frame->Show(true);
    return true;
}

8 comentários:

  1. Danilo muito legal a sua iniciativa, estou começando agora wxWidget e seu blog está sendo uma mão na roda.

    Uma pergunta.
    Eu compilei o meu programa com wxGtk mas uso o KDE como ambiente gráfico, na hora de executar o programa apareceu um icone do XOrg na topo da janela, você sabe me dizer se o programa usa Gtk ou X11?

    Abraços.

    ResponderExcluir
  2. Caio, fico feliz em saber que meu blog está ajudando no seu aprendizado.
    O Gtk é o toolkit que roda na plataforma X11.
    A plataforma X11 aceita vários toolkits para interface gráfica, os mais usados são o Gtk (GNOME) e o QT (KDE), ou seja, Gtk e X11 são coisas distintas. O Gtk é muito utilizado no ambiente GNOME mas também pode ser utilizado em outros ambientes como o KDE (que é seu caso).
    Você pode definir o ícone da sua aplicação através do método SetIcon no construtor do frame. Ex: SetIcon(wxIcon(wxT("nome_arquivo.xpm")));

    ResponderExcluir
  3. 2 erros durante a instalação em linux, que poderão ser resolvidos instalando algumas dependências:

    Erro 1
    The development files for GTK+ were not found.
    Solução
    sudo apt-get install libgtk2.0-dev

    Erro 2
    configure: error: OpenGL libraries not available
    Solução
    sudo aptitude install libgl1-mesa-dev libglu1-mesa-dev

    ResponderExcluir
  4. Para iniciantes:
    Onde devo colocar os códigos?

    No Code::Blocks. Exemplo:
    File > New > Project > wxWidgets project > Go

    No wizard do wxWidgets project:
    - Escolher versão do wxWidgets instalada, nome e localização do projecto, etc.
    - Preferred GUI Builder - wxFormBuilder (deve ser instalado à parte); Application Type - Frame Based
    - Compiler: GNU GCC Compiler (deixar as opções seleccionadas por defeito)
    - Em linux: Use default wxWidgets configuration; Other options - Create empty project

    File > New > Empty File > Sim (adicionar novo ficheiro ao projecto activo) > Nomear o ficheiro

    Criar 4 ficheiros no total com os seguintes nomes:
    frame.h
    frame.cpp
    main.h
    main.cpp

    Copiar para cada um dos ficheiros a parcela do código correspondente.

    ResponderExcluir
  5. De nada. Por favor, continue desenvolvendo este blog na medida das suas possibilidades.

    ResponderExcluir
  6. Sim. Vou continuar a desenvolve-lo. No momento me falta um pouco de tempo, mas assim que puder continuarei.

    ResponderExcluir
  7. Gostei do programa, no entanto, onde encontro tutorial sobre o programa em português, livros, apostilas...

    ResponderExcluir