Inicio.
Nesta continuação iremos construir um relatório simples para o nosso aplicativo, utilizando o Kugar, uma ferramenta de geração de relatórios pertencente ao pacote Koffice do KDE. Existem outras ferramentas de relatórios para Linux, como o Agata Report, mas achei o Kugar por ser nativo do KDE mais fácil de integrar a um aplicativo desenvolvido em Qt.
Obs: Baixe aqui os fontes do aplicativo.
O Kugar gera o relatório em duas etapas, primeiro você cria um modelo no Kugar Designer, que sera a parte gráfica do relatório, depois cria o arquivo de dados que tem de ser no formato XML, obedecendo ao DTD (Document Type Definition) do Kugar. Antes de mais nada voltemos ao nosso aplicativo de exemplo, cadastro, abrindo a tela principal, fClientes_Parent.ui, no Qt Designer:
Abaixo:Nosso aplicativo.(Clique na imagem para ampliar).
>
Vamos adicionar mais um botão para gerar o relatório, de a ele o nome de botao_Relatorio:
Abaixo, Tela do aplicativo com botão do relatório.(Clique na imagem para ampliar).
>
Podemos agora criar o modelo de nosso relatório no Kugar Designer, lembrando que o Kugar faz parte do Koffice, acredito que todas as distribuições que tenham o KDE tenham também o Koffice, você pode encontrar detalhe de como obter e instalar o Kugar em: http://www.koffice.org/kugar/ , detalhes podem ser obtidos em: http://docs.kde.org/development/pt/koffice/kugar/ . Abra o Kugar Designer:
Abaixo, Kugar Designer.(Clique na imagem para ampliar).
>
Agora clique na aba general:
Abaixo, Kugar Designer.(Clique na imagem para ampliar).
>
Escolha o tamanho de pagina que quiser, aqui eu escolhi A4, e clique duas vezes para começarmos:
Abaixo, Kugar Designer, tela principal.(Clique na imagem para ampliar).
>
Abaixo a esquerda você tem a barra de “bandas” do Kugar Designer, assim como o “Quick Report” do Delphi® , o Kugar é orientado a “bandas” ou faixas ou sessões, como queira. Clique em Rh para adicionarmos uma banda “Report Header” ao relatório:
Abaixo, Kugar Designer com Header.(Clique na imagem para ampliar).
>
Clique a direita na propriedade height e ajuste para 25, depois clique a esquerda na barra de componentes em “ab” para colocarmos um label no header, clique duas vezes no label para editar o texto e digite “Sistema exemplo QT”, centralize na banda, clique na propriedade “family” e se abrira uma caixa de dialogo de fontes, escolha as opções que achar melhor:
Abaixo, Kugar Designer com Header e label.(Clique na imagem para ampliar).
>
Repita o procedimento e coloque um “Page header” (botão “ph”, embaixo) e mais um label com o texto “Cadastro de clientes”:
Abaixo, Kugar Designer com Page Header.(Clique na imagem para ampliar).
>
Novamente, repita o procedimento agora colocando um “Detail Header” (Dh), ele ira abrir uma pequena janela pedindo para informar o nivel da banda, ele vira com o zero (0) por default, pode deixar e clique ok:
Abaixo, Kugar Designer com Detail Header.(Clique na imagem para ampliar).
>
Acerte a largura do Detail Header para 25 e coloque dois labels, um para o código do cliente e o outro para o nome, que são os campos da nossa tabela:
Abaixo, Kugar Designer com Detail Header e labels.(Clique na imagem para ampliar).
>
Agora coloque uma banda de detalhes, “Detail” ou botão “D” embaixo, novamente se abrira a janela pedindo o nivel, deixe o zero default, depois de acertar a altura da banda, coloque dois campos (“Field”, botão “F”) logo abaixo e alinhados com os dois labels da “Detail Header”, Código e Nome, em cada um deles você ira setar as propriedades “Name” e “Type”, tomando cuidado com a propriedade “name”, pois ela é case-sensitive, ou seja, o nome tem que ser igual ao que esta no banco de dados, se for minúsculo la tem de ser também no Kugar, apesar de o Kugar não se ligar diretamente ao banco. A propriedade “Type” também tem de ser de acordo com o tipo do campo no banco:
Abaixo, Kugar Designer com Detail.(Clique na imagem para ampliar).
>
Agora coloque um “Page Footer” que ser o rodapé da pagina, coloque dois “Special Field”, um para data e outro para numero da pagina, isto você seta na propriedade “Type”:
Abaixo, Kugar Designer page Footer.(Clique na imagem para ampliar).
>
Esta pronto o nosso modelo, lembrando que ele é extremamente simples, serve somente para iniciantes aprenderem como fazer. Vá ao diretório sistemaqt onde esta nosso projeto e dentro dele crie outro diretório chamado relatórios, salve nosso modelo neste diretório, o Kugar escolhera automaticamente a extensão .ktf. Falta agora criarmos a segunda parte, o segundo arquivo que é o arquivo de dados que tem a extensão .kdf, isto sera feito pelo nosso aplicativo, extraindo os dados do banco de dados e gerando o arquivo .kdf de acordo com o DTD do Kugar, este arquivo é um arquivo XML. Agora abra novamente o projeto no Kdevelop para criarmos o código associado ao botão imprimir que criamos no designer, abra o arquivo cadastro.h e adicione em private slots a seguinte linha: void gera_Relatorio(); Ele ficara assim:
Adicione na sessão de declaração de classes as seguintes linhas:
class Qfile;
class QProcess;
Ela ficara assim:
class QSqlQuery;
class QSqlQueryModel;
class QFile;
class QProcess;
Depois vá até a sessão private: e acrescente as declarações:
QFile* arquivo; //Para gerar o arquivo do relatório.
//Para charmar o Kugar e verificar a existencia de arquivos anteriores.
QProcess* exclui_Arquivo;
QProcess* cria_Arquivo;
QProcess* chama_Kugar;
Ela ficara assim:
private:
QSqlQuery* query_Clientes;//Nossa query de trabalho.
QSqlQueryModel* model_Clientes;
QFile* arquivo;
QProcess* exclui_Arquivo;
QProcess* cria_Arquivo;
QProcess* chama_Kugar;
Agora abra cadastro.cpp, vá até a sessão de includes e coloque:
#include <QFile>// Para gerar o relatório.
#include <QProcess> //Para chamar o Kugar
#include <QTextStream>//Para escrever no arquivo.
Depois vá ao final do constructor de fCad_Clientes e instancie os objetos declarados em cadastro.h:
arquivo=new QFile(this);
chama_Kugar=new QProcess(this);
exclui_Arquivo=new QProcess(this);
cria_Arquivo=new QProcess(this);
Abaixo crie a linha para conectar o SLOT gera_Relatorio() ao SIGNAL clicked() do botão botao_Relatorio:
connect(botao_Relatorio,SIGNAL(clicked()),this,SLOT(gera_Relatorio()));
lembrando que o constructor é a parte do arquivo onde esta a declaração de inicio:
fCad_Clientes::fCad_Clientes(QWidget *parent, const char *name)
Lembre-se de que para cada objeto instanciado com new você deve colocar um delete, va para o destructor de fCad_Clientes e coloque os delete:
fCad_Clientes::~fCad_Clientes()
{
delete query_Clientes;
delete model_Clientes;
delete chama_Kugar;
delete exclui_Arquivo;
delete cria_Arquivo;
delete arquivo;
}
Agora, vá até o final e acrescente a definição de gera_Relatorio();
Compile, rode o aplicativo e clique no botão de gerar relatório:
Abaixo, o relatório pronto.(Clique na imagem para ampliar).
>
O relatorio com preview:
Abaixo, relatorio com preview.(Clique na imagem para ampliar).
>
Obs: Baixe aqui os fontes do aplicativo.
Tutorial anterior: Desenvolvendo um aplicativo cliente/servidor em C++ Qt/Kdevelop
Próximo Tutorial: Integrando o Agata Report a um aplicativo Qt
Obs: Baixe aqui os fontes do aplicativo.
O Kugar gera o relatório em duas etapas, primeiro você cria um modelo no Kugar Designer, que sera a parte gráfica do relatório, depois cria o arquivo de dados que tem de ser no formato XML, obedecendo ao DTD (Document Type Definition) do Kugar. Antes de mais nada voltemos ao nosso aplicativo de exemplo, cadastro, abrindo a tela principal, fClientes_Parent.ui, no Qt Designer:
Abaixo:Nosso aplicativo.(Clique na imagem para ampliar).
>
Vamos adicionar mais um botão para gerar o relatório, de a ele o nome de botao_Relatorio:
Abaixo, Tela do aplicativo com botão do relatório.(Clique na imagem para ampliar).
>
Podemos agora criar o modelo de nosso relatório no Kugar Designer, lembrando que o Kugar faz parte do Koffice, acredito que todas as distribuições que tenham o KDE tenham também o Koffice, você pode encontrar detalhe de como obter e instalar o Kugar em: http://www.koffice.org/kugar/ , detalhes podem ser obtidos em: http://docs.kde.org/development/pt/koffice/kugar/ . Abra o Kugar Designer:
Abaixo, Kugar Designer.(Clique na imagem para ampliar).
>
Agora clique na aba general:
Abaixo, Kugar Designer.(Clique na imagem para ampliar).
>
Escolha o tamanho de pagina que quiser, aqui eu escolhi A4, e clique duas vezes para começarmos:
Abaixo, Kugar Designer, tela principal.(Clique na imagem para ampliar).
>
Abaixo a esquerda você tem a barra de “bandas” do Kugar Designer, assim como o “Quick Report” do Delphi® , o Kugar é orientado a “bandas” ou faixas ou sessões, como queira. Clique em Rh para adicionarmos uma banda “Report Header” ao relatório:
Abaixo, Kugar Designer com Header.(Clique na imagem para ampliar).
>
Clique a direita na propriedade height e ajuste para 25, depois clique a esquerda na barra de componentes em “ab” para colocarmos um label no header, clique duas vezes no label para editar o texto e digite “Sistema exemplo QT”, centralize na banda, clique na propriedade “family” e se abrira uma caixa de dialogo de fontes, escolha as opções que achar melhor:
Abaixo, Kugar Designer com Header e label.(Clique na imagem para ampliar).
>
Repita o procedimento e coloque um “Page header” (botão “ph”, embaixo) e mais um label com o texto “Cadastro de clientes”:
Abaixo, Kugar Designer com Page Header.(Clique na imagem para ampliar).
>
Novamente, repita o procedimento agora colocando um “Detail Header” (Dh), ele ira abrir uma pequena janela pedindo para informar o nivel da banda, ele vira com o zero (0) por default, pode deixar e clique ok:
Abaixo, Kugar Designer com Detail Header.(Clique na imagem para ampliar).
>
Acerte a largura do Detail Header para 25 e coloque dois labels, um para o código do cliente e o outro para o nome, que são os campos da nossa tabela:
Abaixo, Kugar Designer com Detail Header e labels.(Clique na imagem para ampliar).
>
Agora coloque uma banda de detalhes, “Detail” ou botão “D” embaixo, novamente se abrira a janela pedindo o nivel, deixe o zero default, depois de acertar a altura da banda, coloque dois campos (“Field”, botão “F”) logo abaixo e alinhados com os dois labels da “Detail Header”, Código e Nome, em cada um deles você ira setar as propriedades “Name” e “Type”, tomando cuidado com a propriedade “name”, pois ela é case-sensitive, ou seja, o nome tem que ser igual ao que esta no banco de dados, se for minúsculo la tem de ser também no Kugar, apesar de o Kugar não se ligar diretamente ao banco. A propriedade “Type” também tem de ser de acordo com o tipo do campo no banco:
Abaixo, Kugar Designer com Detail.(Clique na imagem para ampliar).
>
Agora coloque um “Page Footer” que ser o rodapé da pagina, coloque dois “Special Field”, um para data e outro para numero da pagina, isto você seta na propriedade “Type”:
Abaixo, Kugar Designer page Footer.(Clique na imagem para ampliar).
>
Esta pronto o nosso modelo, lembrando que ele é extremamente simples, serve somente para iniciantes aprenderem como fazer. Vá ao diretório sistemaqt onde esta nosso projeto e dentro dele crie outro diretório chamado relatórios, salve nosso modelo neste diretório, o Kugar escolhera automaticamente a extensão .ktf. Falta agora criarmos a segunda parte, o segundo arquivo que é o arquivo de dados que tem a extensão .kdf, isto sera feito pelo nosso aplicativo, extraindo os dados do banco de dados e gerando o arquivo .kdf de acordo com o DTD do Kugar, este arquivo é um arquivo XML. Agora abra novamente o projeto no Kdevelop para criarmos o código associado ao botão imprimir que criamos no designer, abra o arquivo cadastro.h e adicione em private slots a seguinte linha: void gera_Relatorio(); Ele ficara assim:
private slots://Nossas funções de trabalho.
void grava_na_Tabela();
void altera_na_Tabela();
void exclui_na_Tabela();
void limpa_Tela();
void gera_Relatorio();
Adicione na sessão de declaração de classes as seguintes linhas:
class Qfile;
class QProcess;
Ela ficara assim:
class QSqlQuery;
class QSqlQueryModel;
class QFile;
class QProcess;
Depois vá até a sessão private: e acrescente as declarações:
QFile* arquivo; //Para gerar o arquivo do relatório.
//Para charmar o Kugar e verificar a existencia de arquivos anteriores.
QProcess* exclui_Arquivo;
QProcess* cria_Arquivo;
QProcess* chama_Kugar;
Ela ficara assim:
private:
QSqlQuery* query_Clientes;//Nossa query de trabalho.
QSqlQueryModel* model_Clientes;
QFile* arquivo;
QProcess* exclui_Arquivo;
QProcess* cria_Arquivo;
QProcess* chama_Kugar;
Agora abra cadastro.cpp, vá até a sessão de includes e coloque:
#include <QFile>// Para gerar o relatório.
#include <QProcess> //Para chamar o Kugar
#include <QTextStream>//Para escrever no arquivo.
Depois vá ao final do constructor de fCad_Clientes e instancie os objetos declarados em cadastro.h:
arquivo=new QFile(this);
chama_Kugar=new QProcess(this);
exclui_Arquivo=new QProcess(this);
cria_Arquivo=new QProcess(this);
Abaixo crie a linha para conectar o SLOT gera_Relatorio() ao SIGNAL clicked() do botão botao_Relatorio:
connect(botao_Relatorio,SIGNAL(clicked()),this,SLOT(gera_Relatorio()));
lembrando que o constructor é a parte do arquivo onde esta a declaração de inicio:
fCad_Clientes::fCad_Clientes(QWidget *parent, const char *name)
Lembre-se de que para cada objeto instanciado com new você deve colocar um delete, va para o destructor de fCad_Clientes e coloque os delete:
fCad_Clientes::~fCad_Clientes()
{
delete query_Clientes;
delete model_Clientes;
delete chama_Kugar;
delete exclui_Arquivo;
delete cria_Arquivo;
delete arquivo;
}
Agora, vá até o final e acrescente a definição de gera_Relatorio();
void fCad_Clientes::gera_Relatorio()
{
//Verifica a existencia de arquivos anteriores, se não, cria um novo arquivo de dados vazio.
if (arquivo->exists("/home/rodolfo/sistemaqt/relatorios/relatorio_clientes.kdf"))
{
exclui_Arquivo->start("rm /home/rodolfo/sistemaqt/relatorios/relatorio_clientes.kdf");
exclui_Arquivo->waitForFinished();
cria_Arquivo->start("/usr/bin/touch /home/rodolfo/sistemaqt/relatorios/relatorio_clientes.kdf");
cria_Arquivo->waitForFinished();
}
else
{
cria_Arquivo->start("/usr/bin/touch /home/rodolfo/sistemaqt/relatorios/relatorio_clientes.kdf");
cria_Arquivo->waitForFinished();
}
QSqlQuery* query_rel=new QSqlQuery;// A query do relatório
query_rel->exec(" select * from clientes order by nome");
//Seta o objeto arquivo para o arquivo no disco e escreve nele.
arquivo->setFileName("/home/rodolfo/sistemaqt/relatorios/relatorio_clientes.kdf");
if (arquivo->open(QIODevice::WriteOnly | QIODevice::Text))
{
//Aqui é de acordo com o DTD do Kugar.
QTextStream out(arquivo);
out <<"<?xml version="<<QChar(34)<<"1.0"<<QChar(34)<<" encoding="<<QChar(34)<<"UTF-8"<<QChar(34)<<"?>"<<"\n";
out <<"\n";
out <<"<!DOCTYPE KugarData ["<<"\n";
out <<" <!ELEMENT KugarData (Row* )>"<<"\n";
out <<" <!ATTLIST KugarData"<<"\n";
out <<" Template CDATA #REQUIRED>"<<"\n";
out <<"\n";
out <<" <!ELEMENT Row EMPTY>"<<"\n";
out <<" <!ATTLIST Row "<<"\n";
out <<" level CDATA #REQUIRED"<<"\n";
out <<" codigo CDATA #REQUIRED"<<"\n";
out <<" nome CDATA #REQUIRED>"<<"\n";
out <<"]>"<<"\n";
out <<"\n";
out <<"<KugarData Template="<<QChar(34)<<"relatorio_clientes.ktf"<<QChar(34)<<">"<<"\n";
while (query_rel->next())
{
out <<"<Row level="<<QChar(34)<<"0"<<QChar(34)<<" codigo="<<QChar(34)<<query_rel->value(0).toString()<<QChar(34)<<" nome="<<QChar(34)<<query_rel->value(1).toString()<<QChar(34)<<" />"<<"\n";
}
out <<"</KugarData>"<<"\n";
//Aqui chama o Kugar para mostrar o relatório.
chama_Kugar->start("kugar /home/rodolfo/sistemaqt/relatorios/relatorio_clientes.kdf");
}
delete query_rel;
}
Compile, rode o aplicativo e clique no botão de gerar relatório:
Abaixo, o relatório pronto.(Clique na imagem para ampliar).
>
O relatorio com preview:
Abaixo, relatorio com preview.(Clique na imagem para ampliar).
>
Obs: Baixe aqui os fontes do aplicativo.
Tutorial anterior: Desenvolvendo um aplicativo cliente/servidor em C++ Qt/Kdevelop
Próximo Tutorial: Integrando o Agata Report a um aplicativo Qt