Inicio.
Neste pequeno tutorial vou demonstrar o funcionamento básico das ferramentas de construção (building) de aplicativos da biblioteca Qt, não é um tutorial de inicio a programação Qt, para isso indico vários outros tutorias aqui no site, de outros autores, todos sobre programação basica em Qt.
O objetivos deste tutorial é faze-lo entender o mecanismo subjacente de construção de um aplicativo Qt quando se usa uma ferramenta RAD como Kdevelop ou QtCreator, justamente para entendermos o trabalho que deixamos de ter ao usar uma destas ferramentas. Muitas vezes ao usarmos uma ferramenta RAD podemos ter algum problema e por isso é bom sabermos o que esta acontecendo nos “bastidores” se precisarmos resolver o problema na “mão”, a seqüencia de passos a seguir é a mesma que as IDE's citadas acima seguem, chamando as ferramentas da Qt e automatizando o processo para nós.
A ferramenta mais basica e essencial , diria a mais importante, é o Qmake, seu papel é gerar o makefile do aplicativo a partir de um arquivo de projeto que ele cria, e chamar outros aplicativos como o moc e o uic, o makefile sera usado pelo make.
Para entendermo vamos criar um pequeno aplicativo na “mão”, isto é, sem usarmos o Kdevelop ou QtCreator ou o Designer.
Crie um diretório com o nome que quiser, dentro dele vamos criar somente o main.cpp(use um editor de texto qualquer de sua preferencia) com a seguinte estrutura:
#include <QApplication>
#include <QLabel>
#include <QtGui>
int main(int argc, char** argv)
{
QApplication app(argc, argv);
QLabel texto("Olá mundo!",0);
texto.setGeometry(0,0,400,100);
QRect rect = QApplication::desktop()->availableGeometry(&texto);
texto.move(rect.center() - texto.rect().center());
texto.show();
return app.exec();
}
Agora no console digite: qmake -project
Abaixo:Arquivo main.cpp.(Clique na imagem para ampliar).
>
Após isto o qmake ira criar um arquivo de projeto com o nome do diretório de onde o chamamos e extensão .pro, no meu caso, teste_qmake.pro.
Abaixo, estrutura do arquivo de projeto gerado pelo qmake:
######################################################################
# Automatically generated by qmake (2.01a) seg abr 27 17:05:11 2009
######################################################################
TEMPLATE = app
TARGET =
DEPENDPATH +=
. INCLUDEPATH +=
. # Input
SOURCES += main.cpp
Abaixo, observe que o qmake gerou o arquivo no diretório.Clique na imagem para ampliar).
>
Este arquivo de projeto pode ser alterado para se incluir, por exemplo, novos arquivos fontes,dai utilizamos a variável do qmake chamada SOURCES, o arquivo é composto de variáveis que devem ser utilizadas de acordo com a finalidade do seu programa, consulte a documentação da Qt para saber sobre as outras variáveis(/usr/local/Trolltech/Qt-4.5.0/doc/html/qmake-variable-reference.html). A partir deste arquivo de projeto o qmake tem informações para então, num segundo passo, gerar o makefile, bastando para isso digitar qmake no console:
Abaixo, gerando o makefile.(Clique na imagem para ampliar).
>
Após este passo já temos um makefile gerado no nosso diretório:
Abaixo, makefile.(Clique na imagem para ampliar).
>
Agora basta apenas chamarmos o make para compilar os fontes e gerar o binario, digite make no console:
Abaixo, compilando os fontes.(Clique na imagem para ampliar).
>
Feito isso, se não houver nenhum erro em nosso main.cpp, sera gerado um binario no diretório:
Abaixo, binario gerado no diretorio.(Clique na imagem para ampliar).
>
Digite no console ./teste_qmake:
Abaixo, binario rodando.(Clique na imagem para ampliar).
>
Esta seqüencia de três passos, qmake -project, qmake e make construiu nosso aplicativo, veremos abaixo em que situações o qmake vai chamar o uic e o moc. Abra o QtDesigner e crie uma nova QmainWindow, coloque na propriedade objectName o nome tela_Principal e na propriedade WindowTitle o texto “Tela Principal”, salve no diretório do nosso projeto com o nome de tela_Principal.ui.:
Abaixo, Designer.(Clique na imagem para ampliar).
>
Modifique o main.cpp, deixando-o assim:
#include <QApplication>
#include <QtGui>
int main(int argc, char** argv)
{
QApplication app(argc, argv);
return app.exec();
}
Agora, exclua todos os arquivos do diretório, deixando somente o main.cpp e o tela_Principal.ui:
Abaixo, main.cpp e tela_Principal.ui.(Clique na imagem para ampliar).
>
Agora novamente digite no console qmake -project, novamente o qmake ira gerar o arquivo teste_qmake.pro, só que desta vez com uma nova variavel do qmake:
######################################################################
# Automatically generated by qmake (2.01a) ter abr 28 15:46:28 2009
######################################################################
TEMPLATE = app
TARGET =
DEPENDPATH +=
INCLUDEPATH +=
# Input
FORMS += tela_Principal.ui
SOURCES += main.cpp
A nova variavel é FORMS, é quem ira instruir o qmake ao gerar o makefile a também colocar nele instruções de chamada do utilitário uic (User Interface Compiler). O qmake reconhece automaticamente a presença do arquivo de interface (.ui) e coloca-o sob a variavel FORMS dentro do arquivo de projeto (.pro).
Digite agora no console somente qmake para gerarmos o makefile:
Abaixo, makefile e arquivo .ui.(Clique na imagem para ampliar).
>
Dentro do makefile você localizara as seguintes linhas:
compiler_uic_make_all: ui_tela_Principal.h
compiler_uic_clean:
-$(DEL_FILE) ui_tela_Principal.h
ui_tela_Principal.h: tela_Principal.ui
/usr/local/Trolltech/Qt-4.5.0/bin/uic tela_Principal.ui -o ui_tela_Principal.h
Elas correspondem a chamada ao utilitario uic que sera feita quando chamarmos o make, então façamos isso, vamos chamar o make no console:
Abaixo, chamando o make.(Clique na imagem para ampliar).
>
Observe que foi gerado o arquivo ui_tela_principal.h, um arquivo header com a definição da classe tela_Principal, gerado pelo uic a partir do arquivo tela_Principal.ui que nada mais é do que um arquivo texto com definições em XML da disposição dos widgets na tela e suas propriedades que serve de orientação ao uic para gerar o arquvo fonte C++.
Recordando, vimos então como o qmake com o parâmetro -project gera o arquivo .pro, depois o mesmo qmake sem nenhum parâmetro gera o makefile e o make chama o uic que gera o arquivo header com a definição da classe.
Neste ultimo passo o make também compilou o main.cpp e gerou o binário, porem neste caso o binário não faz nada, vamos criar uma classe herdada da classe tela_Principal para mais adiante ilustrarmos o funcionamento de outra ferramenta Qt, o moc. Crie dois arquivos, tela_prin_Filha.h e tela_prin_Filha.cpp com a seguinte estrutura:
tela_prin_Filha.h:
#ifndef TELA_PRIN_FILHA_H
#define TELA_PRIN_FILHA_H
#include "ui_tela_Principal.h"
class tela_prin_Filha : public QMainWindow,private Ui::tela_Principal
{ public:
tela_prin_Filha();
~tela_prin_Filha();
};
#endif
tela_prin_Filha.cpp:
#include "tela_prin_Filha.h"
tela_prin_Filha::tela_prin_Filha()
{
setupUi(this);
}
tela_prin_Filha::~tela_prin_Filha()
{
}
main.cpp:
#include <QApplication>
#include <QtGui>
#include "tela_prin_Filha.h"
int main(int argc, char** argv)
{
QApplication app(argc, argv);
tela_prin_Filha* tela_prin=new tela_prin_Filha;
QRect rect = QApplication::desktop()->availableGeometry(tela_prin);
tela_prin->move(rect.center() - tela_prin->rect().center());
tela_prin->show();
return app.exec();
}
Agora, exclua todos os arquivos do diretório, com exceção de :
main.cpp
tela_Principal.ui
tela_prin_Filha.cpp
tela_prin_Filha.h
Novamente, digite no console qmake -project:
teste_qmake.pro:
######################################################################
# Automatically generated by qmake (2.01a) ter abr 28 17:53:42 2009
######################################################################
TEMPLATE = app
TARGET =
DEPENDPATH +=
INCLUDEPATH +=
# Input
HEADERS += tela_prin_Filha.h
FORMS += tela_Principal.ui
SOURCES += main.cpp tela_prin_Filha.cpp
Agora, digite no consolo qmake e depois make:
Abaixo, arquivo header gerado.(Clique na imagem para ampliar).
>
Esta seqüencia de comandos demonstrou as ferramentas de building da Qt em ação, gerando o arquivo de projeto, um arquivo header C++ com a definição da classe principal do aplicativo, o makefile e por ultimo a compilação de tudo e a geração do binário.
No console, digite: ./teste_qmake.
Abaixo, nossa janela principal rodando.(Clique na imagem para ampliar).
>
Agora, veremos em ação o moc (Meta-Object Compiler), ferramenta responsavel por gerar um arquivo moc, uma extensão ao aplicativo para que o pré processador C++ possa entender e habilitar o mecanismo de signal-slot da Qt, para isso é preciso que ele encontre a macro Q_OBJECT no header de definição da classe, sem esta macro o mecanismo não funciona, ao encontrar a macro o moc vai gerar código C++ valido.
Abra novamente no Designer nossa tela principal, tela_Principal.ui e adicione um QpushButton a janela, de a propriedade text o valor “Abrir”:
Abaixo, Designer com janela e botão(Clique na imagem para ampliar).
>
Vamos usar este botão para chamar um QfileDialog a partir de nossa janela principal.
Abra o arquivo tela_prin_Filha.h e deixe-o assim:
#ifndef TELA_PRIN_FILHA_H
#define TELA_PRIN_FILHA_H
#include "ui_tela_Principal.h"
class tela_prin_Filha : public QMainWindow,private Ui::tela_Principal
{
Q_OBJECT
public:
tela_prin_Filha();
~tela_prin_Filha();
private slots:
void abre_dialogo();
};
#endif
Observe a adição da macro Q_OBJECT e da declaração de um slot para chamarmos o QfileDialog.
Agora abra tela_prin_Filha.cpp, deixe o arquivo assim:
#include "tela_prin_Filha.h"
#include <QString>
#include <QFileDialog>
tela_prin_Filha::tela_prin_Filha()
{
setupUi(this);
connect(pushButton,SIGNAL(clicked()),this,SLOT(abre_dialogo()));
}
tela_prin_Filha::~tela_prin_Filha()
{
}
void tela_prin_Filha::abre_dialogo()
{
QString arquivo = QFileDialog::getOpenFileName(this, tr("Abrir arquivo texto"), tr("txt (*.txt);; All files (*.*)"));
}
Observe a implementação do slot abre_dialogo() e o método connect para conectar o signal clicked() do botão ao slot que criamos. Agora de um make clean no console, e digite novamente, na seqüencia:
qmake -project
qmake
make
Resultado:
Abaixo, moc gerado.(Clique na imagem para ampliar).
>
Observe que o moc gerou o arquivo moc_tela_prin_Filha.cpp, permitindo o funcionamento do mecanismo signal-slot da Qt.
Abrindo o makefile você encontrara as seguintes linhas:
compiler_moc_header_clean:
-$(DEL_FILE) moc_tela_prin_Filha.cpp
moc_tela_prin_Filha.cpp: ui_tela_Principal.h \
tela_prin_Filha.h
/usr/local/Trolltech/Qt-4.5.0/bin/moc $(DEFINES) $(INCPATH) tela_prin_Filha.h -o moc_tela_prin_Filha.cpp
Vejam que o qmake, ao montar o makefile, analisou os fontes identificando a presença da macro Q_OBJECT colocando então as linhas para que o make chame o moc que ira criar o arquivo moc_tela_prin_Filha.cpp.
Abaixo nossa janela principal rodando, com o QfileDialog aberto.(Clique na imagem para ampliar).
>
Espero assim ter demonstrado o funcionamento das ferramentas de construção da Qt, quando você estiver usando uma ferramenta RAD como Kdevelop ou QtCreator e ocorrer algum problema, já sabe o caminho das pedras. Os demais tutoriais escritos por mim aqui no site serão todos com o uso do Kdevelop como interface.
Referencia:
qmake: /usr/local/Trolltech/Qt-4.5.0/doc/html/qmake-manual.html
uic: /usr/local/Trolltech/Qt-4.5.0/doc/html/uic.html
moc: file:///usr/local/Trolltech/Qt-4.5.0/doc/html/moc.html#moc
Próximo Tutorial: Desenvolvendo um aplicativo cliente/servidor em C++ Qt/Kdevelop
Comentários:O objetivos deste tutorial é faze-lo entender o mecanismo subjacente de construção de um aplicativo Qt quando se usa uma ferramenta RAD como Kdevelop ou QtCreator, justamente para entendermos o trabalho que deixamos de ter ao usar uma destas ferramentas. Muitas vezes ao usarmos uma ferramenta RAD podemos ter algum problema e por isso é bom sabermos o que esta acontecendo nos “bastidores” se precisarmos resolver o problema na “mão”, a seqüencia de passos a seguir é a mesma que as IDE's citadas acima seguem, chamando as ferramentas da Qt e automatizando o processo para nós.
A ferramenta mais basica e essencial , diria a mais importante, é o Qmake, seu papel é gerar o makefile do aplicativo a partir de um arquivo de projeto que ele cria, e chamar outros aplicativos como o moc e o uic, o makefile sera usado pelo make.
Para entendermo vamos criar um pequeno aplicativo na “mão”, isto é, sem usarmos o Kdevelop ou QtCreator ou o Designer.
Crie um diretório com o nome que quiser, dentro dele vamos criar somente o main.cpp(use um editor de texto qualquer de sua preferencia) com a seguinte estrutura:
#include <QApplication>
#include <QLabel>
#include <QtGui>
int main(int argc, char** argv)
{
QApplication app(argc, argv);
QLabel texto("Olá mundo!",0);
texto.setGeometry(0,0,400,100);
QRect rect = QApplication::desktop()->availableGeometry(&texto);
texto.move(rect.center() - texto.rect().center());
texto.show();
return app.exec();
}
Agora no console digite: qmake -project
Abaixo:Arquivo main.cpp.(Clique na imagem para ampliar).
>
Após isto o qmake ira criar um arquivo de projeto com o nome do diretório de onde o chamamos e extensão .pro, no meu caso, teste_qmake.pro.
Abaixo, estrutura do arquivo de projeto gerado pelo qmake:
######################################################################
# Automatically generated by qmake (2.01a) seg abr 27 17:05:11 2009
######################################################################
TEMPLATE = app
TARGET =
DEPENDPATH +=
. INCLUDEPATH +=
. # Input
SOURCES += main.cpp
Abaixo, observe que o qmake gerou o arquivo no diretório.Clique na imagem para ampliar).
>
Este arquivo de projeto pode ser alterado para se incluir, por exemplo, novos arquivos fontes,dai utilizamos a variável do qmake chamada SOURCES, o arquivo é composto de variáveis que devem ser utilizadas de acordo com a finalidade do seu programa, consulte a documentação da Qt para saber sobre as outras variáveis(/usr/local/Trolltech/Qt-4.5.0/doc/html/qmake-variable-reference.html). A partir deste arquivo de projeto o qmake tem informações para então, num segundo passo, gerar o makefile, bastando para isso digitar qmake no console:
Abaixo, gerando o makefile.(Clique na imagem para ampliar).
>
Após este passo já temos um makefile gerado no nosso diretório:
Abaixo, makefile.(Clique na imagem para ampliar).
>
Agora basta apenas chamarmos o make para compilar os fontes e gerar o binario, digite make no console:
Abaixo, compilando os fontes.(Clique na imagem para ampliar).
>
Feito isso, se não houver nenhum erro em nosso main.cpp, sera gerado um binario no diretório:
Abaixo, binario gerado no diretorio.(Clique na imagem para ampliar).
>
Digite no console ./teste_qmake:
Abaixo, binario rodando.(Clique na imagem para ampliar).
>
Esta seqüencia de três passos, qmake -project, qmake e make construiu nosso aplicativo, veremos abaixo em que situações o qmake vai chamar o uic e o moc. Abra o QtDesigner e crie uma nova QmainWindow, coloque na propriedade objectName o nome tela_Principal e na propriedade WindowTitle o texto “Tela Principal”, salve no diretório do nosso projeto com o nome de tela_Principal.ui.:
Abaixo, Designer.(Clique na imagem para ampliar).
>
Modifique o main.cpp, deixando-o assim:
#include <QApplication>
#include <QtGui>
int main(int argc, char** argv)
{
QApplication app(argc, argv);
return app.exec();
}
Agora, exclua todos os arquivos do diretório, deixando somente o main.cpp e o tela_Principal.ui:
Abaixo, main.cpp e tela_Principal.ui.(Clique na imagem para ampliar).
>
Agora novamente digite no console qmake -project, novamente o qmake ira gerar o arquivo teste_qmake.pro, só que desta vez com uma nova variavel do qmake:
######################################################################
# Automatically generated by qmake (2.01a) ter abr 28 15:46:28 2009
######################################################################
TEMPLATE = app
TARGET =
DEPENDPATH +=
INCLUDEPATH +=
# Input
FORMS += tela_Principal.ui
SOURCES += main.cpp
A nova variavel é FORMS, é quem ira instruir o qmake ao gerar o makefile a também colocar nele instruções de chamada do utilitário uic (User Interface Compiler). O qmake reconhece automaticamente a presença do arquivo de interface (.ui) e coloca-o sob a variavel FORMS dentro do arquivo de projeto (.pro).
Digite agora no console somente qmake para gerarmos o makefile:
Abaixo, makefile e arquivo .ui.(Clique na imagem para ampliar).
>
Dentro do makefile você localizara as seguintes linhas:
compiler_uic_make_all: ui_tela_Principal.h
compiler_uic_clean:
-$(DEL_FILE) ui_tela_Principal.h
ui_tela_Principal.h: tela_Principal.ui
/usr/local/Trolltech/Qt-4.5.0/bin/uic tela_Principal.ui -o ui_tela_Principal.h
Elas correspondem a chamada ao utilitario uic que sera feita quando chamarmos o make, então façamos isso, vamos chamar o make no console:
Abaixo, chamando o make.(Clique na imagem para ampliar).
>
Observe que foi gerado o arquivo ui_tela_principal.h, um arquivo header com a definição da classe tela_Principal, gerado pelo uic a partir do arquivo tela_Principal.ui que nada mais é do que um arquivo texto com definições em XML da disposição dos widgets na tela e suas propriedades que serve de orientação ao uic para gerar o arquvo fonte C++.
Recordando, vimos então como o qmake com o parâmetro -project gera o arquivo .pro, depois o mesmo qmake sem nenhum parâmetro gera o makefile e o make chama o uic que gera o arquivo header com a definição da classe.
Neste ultimo passo o make também compilou o main.cpp e gerou o binário, porem neste caso o binário não faz nada, vamos criar uma classe herdada da classe tela_Principal para mais adiante ilustrarmos o funcionamento de outra ferramenta Qt, o moc. Crie dois arquivos, tela_prin_Filha.h e tela_prin_Filha.cpp com a seguinte estrutura:
tela_prin_Filha.h:
#ifndef TELA_PRIN_FILHA_H
#define TELA_PRIN_FILHA_H
#include "ui_tela_Principal.h"
class tela_prin_Filha : public QMainWindow,private Ui::tela_Principal
{ public:
tela_prin_Filha();
~tela_prin_Filha();
};
#endif
tela_prin_Filha.cpp:
#include "tela_prin_Filha.h"
tela_prin_Filha::tela_prin_Filha()
{
setupUi(this);
}
tela_prin_Filha::~tela_prin_Filha()
{
}
main.cpp:
#include <QApplication>
#include <QtGui>
#include "tela_prin_Filha.h"
int main(int argc, char** argv)
{
QApplication app(argc, argv);
tela_prin_Filha* tela_prin=new tela_prin_Filha;
QRect rect = QApplication::desktop()->availableGeometry(tela_prin);
tela_prin->move(rect.center() - tela_prin->rect().center());
tela_prin->show();
return app.exec();
}
Agora, exclua todos os arquivos do diretório, com exceção de :
main.cpp
tela_Principal.ui
tela_prin_Filha.cpp
tela_prin_Filha.h
Novamente, digite no console qmake -project:
teste_qmake.pro:
######################################################################
# Automatically generated by qmake (2.01a) ter abr 28 17:53:42 2009
######################################################################
TEMPLATE = app
TARGET =
DEPENDPATH +=
INCLUDEPATH +=
# Input
HEADERS += tela_prin_Filha.h
FORMS += tela_Principal.ui
SOURCES += main.cpp tela_prin_Filha.cpp
Agora, digite no consolo qmake e depois make:
Abaixo, arquivo header gerado.(Clique na imagem para ampliar).
>
Esta seqüencia de comandos demonstrou as ferramentas de building da Qt em ação, gerando o arquivo de projeto, um arquivo header C++ com a definição da classe principal do aplicativo, o makefile e por ultimo a compilação de tudo e a geração do binário.
No console, digite: ./teste_qmake.
Abaixo, nossa janela principal rodando.(Clique na imagem para ampliar).
>
Agora, veremos em ação o moc (Meta-Object Compiler), ferramenta responsavel por gerar um arquivo moc, uma extensão ao aplicativo para que o pré processador C++ possa entender e habilitar o mecanismo de signal-slot da Qt, para isso é preciso que ele encontre a macro Q_OBJECT no header de definição da classe, sem esta macro o mecanismo não funciona, ao encontrar a macro o moc vai gerar código C++ valido.
Abra novamente no Designer nossa tela principal, tela_Principal.ui e adicione um QpushButton a janela, de a propriedade text o valor “Abrir”:
Abaixo, Designer com janela e botão(Clique na imagem para ampliar).
>
Vamos usar este botão para chamar um QfileDialog a partir de nossa janela principal.
Abra o arquivo tela_prin_Filha.h e deixe-o assim:
#ifndef TELA_PRIN_FILHA_H
#define TELA_PRIN_FILHA_H
#include "ui_tela_Principal.h"
class tela_prin_Filha : public QMainWindow,private Ui::tela_Principal
{
Q_OBJECT
public:
tela_prin_Filha();
~tela_prin_Filha();
private slots:
void abre_dialogo();
};
#endif
Observe a adição da macro Q_OBJECT e da declaração de um slot para chamarmos o QfileDialog.
Agora abra tela_prin_Filha.cpp, deixe o arquivo assim:
#include "tela_prin_Filha.h"
#include <QString>
#include <QFileDialog>
tela_prin_Filha::tela_prin_Filha()
{
setupUi(this);
connect(pushButton,SIGNAL(clicked()),this,SLOT(abre_dialogo()));
}
tela_prin_Filha::~tela_prin_Filha()
{
}
void tela_prin_Filha::abre_dialogo()
{
QString arquivo = QFileDialog::getOpenFileName(this, tr("Abrir arquivo texto"), tr("txt (*.txt);; All files (*.*)"));
}
Observe a implementação do slot abre_dialogo() e o método connect para conectar o signal clicked() do botão ao slot que criamos. Agora de um make clean no console, e digite novamente, na seqüencia:
qmake -project
qmake
make
Resultado:
Abaixo, moc gerado.(Clique na imagem para ampliar).
>
Observe que o moc gerou o arquivo moc_tela_prin_Filha.cpp, permitindo o funcionamento do mecanismo signal-slot da Qt.
Abrindo o makefile você encontrara as seguintes linhas:
compiler_moc_header_clean:
-$(DEL_FILE) moc_tela_prin_Filha.cpp
moc_tela_prin_Filha.cpp: ui_tela_Principal.h \
tela_prin_Filha.h
/usr/local/Trolltech/Qt-4.5.0/bin/moc $(DEFINES) $(INCPATH) tela_prin_Filha.h -o moc_tela_prin_Filha.cpp
Vejam que o qmake, ao montar o makefile, analisou os fontes identificando a presença da macro Q_OBJECT colocando então as linhas para que o make chame o moc que ira criar o arquivo moc_tela_prin_Filha.cpp.
Abaixo nossa janela principal rodando, com o QfileDialog aberto.(Clique na imagem para ampliar).
>
Espero assim ter demonstrado o funcionamento das ferramentas de construção da Qt, quando você estiver usando uma ferramenta RAD como Kdevelop ou QtCreator e ocorrer algum problema, já sabe o caminho das pedras. Os demais tutoriais escritos por mim aqui no site serão todos com o uso do Kdevelop como interface.
Referencia:
qmake: /usr/local/Trolltech/Qt-4.5.0/doc/html/qmake-manual.html
uic: /usr/local/Trolltech/Qt-4.5.0/doc/html/uic.html
moc: file:///usr/local/Trolltech/Qt-4.5.0/doc/html/moc.html#moc
Próximo Tutorial: Desenvolvendo um aplicativo cliente/servidor em C++ Qt/Kdevelop