Professional Documents
Culture Documents
Janeiro-Fevereiro/2011
C r ia n d o u m in s t a la d o r p a r a s u a s a p lic a e s c o m o InstallJammer
n d i ce
Primeira aula do Minicurso de Programao C++ com Qt (pgina 5)
Validar Entrada do Usurio (pgina 22) Editor Andr Luiz de Oliveira Vasconcelos Colaboradores Adriano H. Hedler Rafael Fassi Thiago Rossener Nogueira Frum QtBrasil InstallJammer (pgina 30) Iniciando na Programao com QML (pgina 41) Primeiro captulo do livro: Como pensar como um cientista da computao (pgina 74)
deixar os "alunos" (se me permitem cham-los assim) prontos para passar para um prximo nvel de aprendizado, no qual a documentao do Qt e a experincia com a ferramenta sejam o bastante. Este curso ter basicamente trs fases, a saber: - Introduo programao em C++ - Orientao a Objetos com C++ - Desenvolvimento com Qt Nas duas primeiras fases so dedicadas exclusivamente ao aprendizado de C++, portanto no teremos contato algum com o Qt. Na ltima fase do curso, com o conhecimento de C++ adequado, passaremos ao desenvolvimento com Qt. Como eu costumava dizer quando dava aulas de informtica l pelos anos 90, no quero prosseguir com o curso enquanto exisitirem dvidas sobre o assunto de cada aula. Ento no vou definir um roteiro para o curso, ou definir prazos para o mesmo. Conto com o retorno dos alunos (por email) para ir ajustando o tempo e o contedo do curso. Para que possamos compartilhar as eventuais dvidas, sugestes, etc, criei um grupo especfico para este minicurso. Anote o endereo e o email do grupo: https://groups.google.com/group/professorvasconcelos?hl=pt-br professorvasconcelos@googlegroups.com
ma frase adequada para definir a filosofia da Revista Qt e a minha postura em relao ao pouco conhecimento ao qual tenho acesso. Compartilhando conhecimento, ao mesmo tempo em que exercitamos, estendemos a outros a oportunidade de aprender. Confirmando esta orientao da Revista Qt, estou publicando a partir desta edio, as aulas de um minicurso de programao em C++ com Qt. Voltado queles que queiram utilizar o Qt, conheam lgica de programao, mas no conheam a linguagem de programao C++, este curso abordar desde os aspectos fundamentais da programao nesta linguagem, passando por programao orientada a objetos at a criao e manuteno de projetos C++ com Qt. Para que tenhamos um melhor aproveitamento, as aulas tero um escopo mnimo e bem definido. Assim, cada assunto abordado ser esgotado atravs de vrios exemplos, demonstraes e exerccios. A ideia que tenhamos ao final de cada aula, o domnio do assunto objeto da mesma. bom destacar que este um "mini" curso, e portanto no tem a pretenso de cobrir TODOS os aspectos relacionados programao em C++, orientao a objetos ou ao Qt. A ideia
Revista Qt - Janeiro/Fevereiro-2011 [5 ]
Vamos combinar mais uma coisa: este canal - o grupo do Minicurso - deve ser usado apenas para questes relacionadas s aulas publicadas, ok? Para esta primeira fase no nosso curso, vamos precisar instalar e configurar em nossas mquinas o ambiente para desenvolvimento em C++. O compilador adotado ser o GCC para as plataformas Windows e Ubuntu Linux. Quem for utilizar o sistema operacional Windows precisa fazer o download do MinGW atravs do endereo: http://sourceforge.net/projects/mingw/
Quando concluir o download, execute o arquivo de instalao do MinGW. A primeira tela do instalador mostrada na figura 1.2:
figura 1.2 Clique no boto Next para continuar. A prxima tela apresenta ao usurio o aviso de que necessrio ter permisso de administrador para prosseguir com a instalao do MinGW (v. figura 1.3). figura 1.1
[6 ] Revista Qt - Janeiro/Fevereiro-2011
figura 1.3 O prximo passo na instalao permite que se instale verses mais atualizadas quando disponveis. Como acabamos de baixar o instalador, a verso selecionada j corresponde mais recente. Para continuar apenas clique no boto Next (figura 1.4).
figura 1.4 Na prxima tela (figura 1.5), temos a licena de uso do MinGW. Para prosseguir marque a opo "I accept the agreement", indicando que voc concorda com os termos da licena e clique novamente no boto Next.
Revista Qt - Janeiro/Fevereiro-2011 [7 ]
figura 1.5 O prximo passo indicar ao instalador em qual diretrio dever ser instalado o MinGW. O diretrio sugerido pelo instalador o C:\MinGW. Quando a instalao for concluda, precisaremos desta informao para completar a configurao do nosso ambiente de desenvolvimento. Mais uma vez, clique no boto Next (figura 1.6).
figura 1.6 Na tela mostrada na figura 1.7, o usurio pode indicar um nome a ser usado no menu Iniciar do Windows para a pasta do MinGW. O nome sugerido pelo instalador MinGW mesmo. Caso no queira que o instalador crie uma opo para o MinGW no menu Iniciar do Windows, marque a opo "Don't create a Start Menu folder". Para prosseguir com a instalao clique no boto Next.
[8 ] Revista Qt - Janeiro/Fevereiro-2011
figura 1.7 O prximo passo da instalao permite que voc selecione componentes a serem instalados. Agora voc vai precisar fazer uma coisa antes de clicar no boto Next. Marque a opo C++ Compiler, que o motivo pelo qual estamos instalando o MinGW e depois... adivinha... clique no boto Next (figura 1.8).
figura 1.8 Finalmente o instalador nos apresenta um resumo das opes selecionadas nas telas anteriores e est pronto para iniciar a instalao propriamente dita, criando a estrutura de diretrios do MinGW com seus respecivos arquivos. Para iniciar o processo, clique no boto Install (figure 1.8).
Revista Qt - Janeiro/Fevereiro-2011 [9 ]
figura 1.9 Durante o processo, o instalador exibir algumas informaes como a cpia e download de arquivos. Como sero feitos downloads de alguns arquivos, a velocidade da sua conexo com a Internet vai acabar determinando o tempo da instalao. Ao final do processo, ser apresentada a tela mostrada na figura 1.10.
figura 1.10 Pronto. O MinGW est instalado em sua mquina. Se voc aceitou a sugesto do instalador, o MinGW foi instalado no diretrio C:\MinGW. O compilador C++ que vamos usar em nosso curso, encontra-se no diretrio bin, dentro do diretrio MinGW (figura 1.11).
figura 1.11
Agora voc precisa indicar ao Windows, o caminho para o compilador C++ do MinGW. Fazemos isso, alterando o contedo da varivel de ambiente PATH. Para ter acesso s variveis de ambiente do Windows, clique no menu Iniciar, selecione Painel de Controle -> Sistema -> Configuraes avanadas do sistema. Na janela "Propriedades do Sistema", clique no boto Variveis de Ambiente (figura 1.12).
Na janela "Variveis de Ambiente", selecione la varivel Path, na seo "Variveis do Sistema" (v. figura 1.13) e clique no boto Editar.
figura 1.12
figura 1.13
Acrescente ;C:\MinGW\bin ao contedo do campo valor da varivel (v. figura 1.14). Clique no boto Ok e... pronto! Para saber se funcionou, abra uma janela do Prompt de Comando pela opo: Iniciar -> Acessrios -> Prompt de Comando e digite o comando mingw32-c++, Se tudo correu bem na instalao e configurao da varivel de ambiente Path, o sistema operacional dever emitir a mensagem: mingw32-c++: no input files, como mostra a figura 1.15. Isto encerra a configurao do nosso ambiente de desenvolvimento C++ no Windows.
figura 1.14
figura 1.15
Agora a vez do Ubuntu Linux. A instalao do ambiente de desenvolvimento em C++ aqui ser mais simples do que no Windows. Basta executar o comando a seguir: $ sudo apt-get install build-essential Voc precisar ter a senha de root para executar esta operao. Para verificar se a instalao ocorreu com sucesso, voc pode executar o comando g++, como mostra a figura a seguir:
Bom, o ambiente para desenvolvimento em C++ est preparado, mas antes de comear a escrever nossos programas, precisamos definir qual o editor de textos utilizaremos. Existem muitas excelentes opes gratuitas de editores de texto prprios para o desenvolvimento em C++, mas como na terceira fase do nosso curso vamos enfatizar o desenvolvimento utilizando o Qt, acho uma boa idia adotar o editor do Qt Creator como editor oficial para o nosso curso. O Qt Creator na verdade muito mais do que apenas um editor de textos para programao em C++. uma IDE - Integrated Development Environment (Ambiente integrado de desenvolvimento). Neste curso, no entanto, utilizaremos apenas o editor, sem aproveitar as facilidades da IDE para criao e manuteno dos projetos. Com esta abordagem, conheceremos mais sobre os projetos em Qt, pois as IDEs "escondem" muito do trabalho envolvido no processo. como se estivssemos aprendendo a dirigir: usamos carros com cmbios manuais e no automticos. Depois que sabemos dirigir podemos optar por possuir um carro com cmbio automtico. De forma semelhante, depois que tiver domnio sobre o ambiente de desenvolvimento em Qt, voc pode (at deve) optar por usar as facilidades de uma IDE (como o Qt Creator). Como vamos precisar do Qt na terceira fase do curso, instale o Qt SDK, seguindo as instrues publicadas na primeira edio da Revista Qt (www.revistaqt.com).
figura 1.16 Se voc obteve o resultado acima, ento o compilador C++ e as bibliotecas de desenvolvimento em C e C++ foram devidamente instalados. A mensagem "g++: no input files" indica que voc executou o compilador sem indicar um arquivo a ser compilado. No se preocupe com isso agora. No final desta aula veremos como compilar um programa.
Com o ambiente de desenvolvimento pronto e o editor de textos definido, podemos finalmente escrever o nosso primeiro programa em C++. Este programa apenas dever imprimir na tela a mensagem: "Funcionou!". No muita coisa, mas como primeiro programa j serve. Vamos l...Execute o Qt Creator (figura 1.17). Com o Qt Creator carregado, clique na opo File do Menu e selecione no menu a opo File e selecione a opo New File or Project (figura 1.18). Outra forma de fazer isso clicando a combinao de teclas Ctrl - N.
figura 1.18 Em seguida, na janela que vai ser aberta, selecione do lado esquerdo a opo C++ e do lado esquerdo a opo C++ Source File (figura 1.19). Depois de selecionar a opo "C++ Source File", clique no boto "Choose" para continuar. figura 1.17
figura 1.20 figura 1.19 Na prxma janela, voc deve informar o nome e a localizao do arquivo a ser criado. Para o nome, informe aula1.cpp e para a localizao informe o diretrio onde deseja criar o arquivo. Para facilitar referncias futuras, sugiro que crie um diretrio chamado minicurso e salve nele todos os arquivos criados nesta primeira fase do curso. No futuro, quando estivermos trabalhando com projetos de verdade, criaremos diretrios especicos para cada um deles. no meu caso, criei um diretrio chamado minicurso dentro de outro Documentos". diretrio chamado Projetos em "Meus
No caso do Ubuntu, criei um diretrio chamado minucurso dentro de um diretrio chamado Projetos em meu diretrio home. Depois de informados o nome do arquivo e sua localizao, clique no boto Next.
figura 1.22 Esta instruo identifica arquivos de cabealho a serem utilizados em nossos programas. Mais tarde veremos o que so arquivos de cabealho. Por ora, basta saber que esta a forma de utilizarmos em nossos programas, cdigos que esto declarados em outros arquivos. No caso do aula1, estamos usando o arquivo iostream que refere-se a uma biblioteca padro de C++ contendo funes para entrada e sada de dados. Usaremos neste programa, um objeto definido nesta biblioteca para sada de dados (impresso na tela do monitor de vdeo). A linha 2 foi deixada em branco para melhorar a legibilidade do programa, vejamos ento a linha 3: using namespace std;
figura 1.21 Clique no boto "Finish" para que o Qt Creator prossiga com a criao do arquivo aula1.cpp. O cdigo do nosso primeiro programa est na figura 1.22. Por enquanto voc pode no estar entendendo muito do cdigo, mas no se preocupe. Os programas apresentados neste curso sero explicados linha a linha. Na primeira linha do nosso programa temos a instruo: #include <iostream>
Esta instruo serve para indicar que neste programa estamos A linha 8 foi deixada em branco e na linha 9 temos a instruo: usando o espao de nomes (namespace) chamado std. No futuro veremos o que vem a ser um espao de nomes (namespace). return 0; A linha 4 tambm foi deixada em branco, ento l vamos ns para Esta instruo indica que a funo main retorna o valor inteiro 0. a linha 5: Em alguns casos, podemos retornar valores diferentes de 0 para indicar situaes relacionadas ao encerramento do programa, int main (int argc, char * argv[]) como diferentes condies de erro. Veremos isto no futuro. Se isto lhe parece grego, no se preocupe. Com o decorrer do Salve o arquivo teclando CTRL - S e vamos compilar o nosso curso voc ir se familiarizando com a sintaxe do C/C++. Por pequeno programa. Veremos os procedimentos de compilao enquanto basta saber que esta linha declara uma funo no Windows e no Linux. chamada main. Este o ponto de entrada dos programas em C e em C++, a funo chamada automaticamente ao executar o programa. Na linha 6 temos um abre chaves - { - que indica o incio de um bloco de cdigo. Neste caso, o bloco que corresponde ao corpo da funo main. Na linha 10 temos o fecha chaves - } - indicando o final do bloco. Na linha 7 - primeira linha do corpo da funo main, temos a seguinte instruo: cout << "Funcionou!"; Esta instruo imprime na sada padro - a tela do monitor de vdeo - a mensagem "Funcionou!".
figura 1.23
figura 1.24 V para o diretrio onde voc salvou o arquivo aula1.cpp e execute o seguinte comando: g++ -o aula1 aula1.cpp Este comando executa o compilador gerando um arquivo executvel. O argumento "-o aula1" indica o nome do arquivo executvel que ser gerado. Neste caso, ser gerado um arquivo chamado aula1.exe. O segundo argumento o nome do arquivo a ser compilado aula1.cpp.
O compilador emitiu algumas advertncias, mas por ora no precisamos nos preocupar com isso. Vejamos agora como compilar o programa na plataforma Linux. O procedimento bem semelhante: abra um terminal, v para o diretrio onde salvo o arquivo aula1.cpp e execute o seguinte comando: g++ -o aula1 aula1.cpp
O comando para compilao o mesmo que utilizamos na plataforma Windows, mas a tivemos diferenas na execuo. Para executar o programa digitamos "./aula1" ao invs de "aula1". Outra sutil diferena est no resultado da execuo. No Windows a mensagem foi impressa em uma linha vazia, enquanto no Linux a mensagem ficou junto com o prompt de comando. Em breve veremos como fazer para colocar uma quebra de linha aps uma mensagem impressa. O objetivo nesta primeira aula era: 1) preparar o ambiente para desenvolvimento em C++ (Ubuntu Linux ou Windows); 2) instalar o editor de textos que utilizaremos durante o curso para escrever nossos cdigos; 3) fazer um pequeno programa para confirmar que a plataforma de desenvolvimento est ok. A partir da prxima aula comearemos a estudar a linguagem C++ propriamente dita, e teremos exerccios para colocar nossos conhecimentos prova. Por enquanto, fiquem vontade para enviar seus emails para professorvasconcelos@googlegroups.com. At a prxima aula. Andr Luiz de Oliveira Vasconcelos
figura 1.25
maiores apresentaes: a finlandesa Nokia e a norte-americana Microsoft. A parceria define o Windows Phone como plataforma primria para os smartphones Nokia. Alm disso, as ferramentas da Microsoft devem ser usadas para desenvolvimento de aplicaes para os dispositivos Nokia com Windows Phone. Para a "comunidade" Qt, a notcia soou como "Nokia abandona o Qt". Uma nota publicada no blog oficial do Qt (http://blog.qt.nokia.com), pelo diretor de Ecosistema Qt, Daniel Kihlberg, relaciona alguns motivos que justificariam a manuteno do Qt pela Nokia. "Qt continuar a desempenhar um papel importante na Nokia", diz Kihlberg. Dentre os motivos, a manuteno de 200 milhes de usurios Symbian da Nokia e uma projeo da empresa para vender mais 150 milhes de dispositivos Symbian nos prximos anos. Alm disso, Kihlberg alega o crescimento do nmero de desenvolvedores em Qt em funo da tecnologia Qt Quick e do novo SDK da Nokia/Qt, a adoo do Qt por parte de outras importantes empresas, citando inclusive a Dreamworks. O objetivo da nota parece mais acalmar a "comunidade" Qt do que propriamente exclarecer o futuro do Qt dentro da Nokia. H quem especule que os planos sejam extinguir o Symbian, adotando o Windows Phone como plataforma nica. Enquanto isso na Sala de Justia... Um desenvolvedor romeno chamado Bogdan Vatra anuncia o lanamento da verso alfa de um "port" do Qt para o sistema Android (http://brlinux.org/2011/necessitas-qt-para-android-versao-alfa/). Esta implementao de Qt para Android, chamada de Necessitas Suite um projeto independente da Nokia e do Google. Revista Qt - Janeiro/Fevereiro-2011 [21]
Este ms foi anunciada uma parceria entra duas empresas gigantes que dispensam
ratar erros de entrada do usurio costuma ser uma tarefa desgastante e que muitas vezes, ocupa Rafael grande parte do tempo de implementao de um software. Uma forma de reduzir o cdigo para Fassi tratamento de erros filtrar a entrada, no permitindo assim que o usurio consiga entrar com um Lobo valor invlido. Por exemplo: Para um campo de entrada QLineEdit que s pode receber um valor numrico inteiro, temos que impedir que o usurio possa digitar qualquer caractere que no seja um nmero O Rafael bacharel no intervalo de (0...9) ou um sinal de menos (-). em Engenharia Para isso, poderamos reimplementar o evento KeyPress para impedir a entrada de caracteres invlidos. Mas somente evitar que sejam digitados caracteres invlidos, muitas vezes no o suficiente para evitar entradas invlidas. Por exemplo: O usurio poderia digitar 92-1 o que no corresponde a um nmero inteiro vlido, pois o sinal de menos s poderia aparecer na primeira posio da string.
Mecatrnica e enviou este artigo sobre validao de entradas de dados como contribuio para a Revista Qt. Quem quiser segui-lo Para eliminar esse problema poderamos fazer uma rotina de validao que executada quando o no Twitter, o texto est sendo editado. Quando estamos implementando um software que contem muitos campos endereo : que devem ser filtrados, o trabalho de filtragem se torna muito cansativo e o cdigo muito grande. @Rafael_Fassi
Em muitos casos podemos usar mscaras de entrada, mas s vezes elas so limitadas ou no aplicveis.
Para resolver esse problema e simplificar nosso trabalho de validao da entrada, existe no Qt a classe abstrata QValidator que serve para validar entradas de texto. Desta se derivam trs subclasses, que so: QIntValidator Valida a entrada de nmeros inteiros. QDoubleValidator Valida a entrada de nmeros fracionrios. QRegExpValidator Valida a entrada com uma expresso regular personalizada.
Se quisermos que em um determinado QLineEdit o usurio s possa digitar um valor numrico inteiro poderamos usar o QIntValidator desta forma: QIntValidator *intValidator = new QIntValidator(this); QLineEdit *lineEdit = new QLineEdit(this); lineEdit->setValidator(intValidator); Vamos supor que estamos desenvolvendo um aplicativo de controle de vendas. Quando o vendedor selecionar um produto, uma varivel chamada QuantDisponivel ir indicar quantas unidades do produto esto disponveis no estoque. Queremos que o vendedor entre com a quantidade do produto a ser vendida em um QLineEdit. Mas precisamos evitar que ele digite algum valor que no seja um nmero inteiro. Tambm queremos evitar que o vendedor digite um valor acima da quantidade disponvel em estoque. Isso poderia ser implementado setando o range de QIntValidator desta forma: QIntValidator *intValidator = new QIntValidator(1, QuantDisponivel, this); Assim, estamos passando o range logo no construtor. Podemos tambm modificar o range utilizando as funes setRange, setButton ou setTop. Um recurso fantstico para a validao de entrada o QRegExpValidator. No vou entrar em detalhes sobre expresses regulares, mas um bom resumo pode ser encontrado em: http://guia-er.sourceforge.net/index.html Para demonstrar o QRegExpValidator, vamos supor que em um campo QLineEdit do nosso aplicativo, precisamos que o usurio digite um valor hexadecimal de 0 a FFFF. Para isso, podemos usar o QRegExpValidator assim:
QValidator *hexValidator = new QRegExpValidator(QRegExp("[0-9A-Fa-f]{1,4}"), this); Desta forma o usurio s poder digitar nmeros no intervalo de (0...9), letras minsculas (a...f) e maisculas (A...F). Para a expresso ser vlida ela dever ter no mnimo um dgito e s podero ser digitados no mximo 4 dgitos. Com a expresso regular, podem ser feitos os mais diversos tipos de validadores de entrada personalizados. Como outro exemplo de expresso regular, esta serve para entrada de horas no formato (hh:mm) "([01][0-9]|2[0-3]):[0-5][0-9]". Nossa entrada vai at 23h e 59m. Dessa forma se o primeiro dgito da hora for 0 ou 1, o segundo pode ir at nove, o que poderia ser (09h) ou (19h). Mas se o primeiro dgito for 2, o segundo s pode ir at 3 que seria o nosso mximo para hora (23h). Neste caso se utiliza o OU, que representado pelo smbolo (|). Ento, a hora pode ser: Com o primeiro digito (0 ou 1) e o segundo de (0...9) OU (|) Com o primeiro dgito igual a dois e o segundo de (0...3) Para os minutos, como vo at 59, ficaria assim: O primeiro pode ser de (0...5) e o segundo de (0...9) Alm de usarmos as subclasses QIntValidator, QDoubleValidator e QRegExpValidator, tambm podemos herdar a classe virtual QValidator e implementar nossa prpria classe de validao. Uma vantagem disso que podemos no somente validar a entrada como tambm fazer transformaes no texto de entrada. Por exemplo, podemos validar a entrada e transform-la em maiscula.
Para demonstrar, vamos criar um validador de entrada hexadecimal que pode permitir entrada negativa (-FF) e pode transformar a entrada para maiscula. Aqui est nosso arquivo de cabealho: #ifndef FVALIDATORS_H #define FVALIDATORS_H #include <QValidator> class FHexValidator : public QValidator { Q_OBJECT public: explicit FHexValidator(QObject *parent = 0, bool _Signal = false, bool _UpperCase = true); void setSignal(bool _Signal) { Signal = _Signal; } void setUpperCase(bool _UpperCase) { UpperCase = _UpperCase; } QValidator::State validate(QString &input, int &pos) const; private: QRegExpValidator *validator; bool Signal; bool UpperCase; }; #endif // FVALIDATORS_H Criamos uma classe FHexValidator que herdada de QValidator e reimplementamos a funo virtual pura validate. Estou usando QRegExpValidator para simplificar o trabalho de filtrar a entrada hexadecimal, mas uma rotina que faa isso poderia ser implementada facilmente. A varivel Signal indica se a entrada pode ser negativa e a varivel UpperCase indica que a entrada deve ser convertida em maiscula. Revista Qt - Janeiro/Fevereiro-2011 [25]
Vamos ao cdigo: #include "fvalidators.h" FHexValidator::FHexValidator(QObject *parent, bool _Signal, bool _UpperCase): QValidator(parent) { validator = new QRegExpValidator(QRegExp("[-0-9A-Fa-f]{1,8}"), this); Signal = _Signal; UpperCase = _UpperCase; } QValidator::State FHexValidator::validate(QString &input, int &pos) const { if(input.contains('-')) { if(!Signal || input[0] != '-' || input.count('-') > 1) return Invalid; if(input.size() < 2) return Intermediate; } if(UpperCase) input = input.toUpper(); return validator->validate(input, pos); } No construtor iniciamos validator para validar uma entrada hexadecimal com at 8 dgitos que pode conter o sinal de (-).
A implementao de validate bem simples. Ele pode retornar 3 estados, que so: Invalid Quando a entrada invlida. Intermediate Quando ainda no determinado se a entrada vlida. Acceptable A entrada vlida. Primeiro a funo checa se a string de entrada contm o caractere (-). Caso contenha a entrada pode ser invlida se o modo de entrada negativa (Signal) no estiver habilitado ou se o caractere (-) no estiver na primeira posio da string. Somente com essas condies poderia acontecer um erro se o usurio digitar (-), voltar o cursor para a primeira posio e digitar novamente (). Para isso no acontecer a entrada tambm ser invalidada se a string contiver mais de um caractere (-). Se a string contm o sinal (-) e no foi invalidada, precisamos saber se existem mais dgitos, pois uma string que contm somente o sinal (-) no aceitvel, mas sim indeterminada. Pois necessita de algum dgito para ser vlida. Logo aps, se o modo UpperCase estiver ativo, o texto transformado em maisculo. Finalmente a string pode ser validada pelo objeto validator, que vai verificar se nela existem somente dgitos hexadecimais e o sinal (-). isso a pessoal, vou ficando por aqui e espero que tenham gostado do artigo. At a prxima!
www.geekandpoke.com
Revista Qt - Janeiro/Fevereiro-2011 [29]
Laboratrio :: InstallJammer
InstallJammer
a segunda edio da Revista Qt, saiu um artigo sobre a distribuio de aplicaes feitas em Qt. O presente artigo pode ser considerado como uma continuao daquele. Desta vez veremos como criar um instalador de verdade para nossas aplicaes, usando o InstallJammer. O instalador simplifica o processo de instalao de nossas aplicaes pois no exigem dos usurios comuns conhecimentos sobre programas de compactao e coisas do gnero. Normalmente o usurio precisa apenas responder a algumas poucas perguntas para proceder a instalao da maioria dos programas. Existem alguns programas gratuitos para gerar instaladores. A escolha pelo InstallJammer foi feita porque alm de grtis ele multiplataforma. Pra comear, faa o download do InstallJammer pelo endereo: www.installjammer.com/download A instao do InstallJammer muito simples, no sendo necessrio um tutorial para isso.
figura 1
Vou demonstrar a criao de um pacote de instalao para uma aplicao chamada Agenda (publicada nesta edio da Revista Qt). A figura 1 mostra a tela do InstallJammer. Para criar um novo projeto, selecione a opo File -> New Project Wizard no menu do InsallJammer.
Laboratrio :: InstallJammer
No primeiro passo da montagem do instalador da nossa aplicao, devemos informar: - O Nome do projeto - Neste caso, Agenda. - O Diretrio raiz do projeto. O diretrio sugerido pelo InstallJammer InstallJammerProjects no diretrio home do usurio. No caso do Windows, o diretrio sugerido ser installJammerProjects na pasta "Meus Documentos" do usurio. Ser criado pelo InstallJammer um diretrio com o nome do projeto a partir do diretrio raiz do projeto. No caso deste exemplo, o diretrio da aplicao ficou como "/home/vasconcelos/InstallJammer/Agenda". Para continuar, clique no boto Next para especificar outras opes do instalador (figura 2). Na prxima tela (figura 3), informe - O nome da aplicao - O nome curto da aplicao - A verso da aplicao - O nome da empresa
figura 2
Em seguida clique no boto Next para continuar. Na prxima tela (figura 4) informamos a verso do instalador (na tela anterior informamos a verso da aplicao) e os nomes dos executveis para Windows e Unix (ou Linux).
Laboratrio :: InstallJammer
figura 3
figura 4
Laboratrio :: InstallJammer
O prximo passo informar o diretrio onde est a sua aplicao. Observe pela figura 5 que o diretrio no meu caso o "Agenda-build-desktop" Este o padro da verso 2.01 do Qt Creator que foi a que utilizei para compilar a aplicao Agenda - o nome da aplicao acrescido de "-build-desktop. Este diretrio corresponde quele em que se encontra o executvel e demais arquivos que iro compor o pacote de instalao. Se voc estiver em dvida sobre quais arquivos devem ser includos para a montagem do pacote de instalao da sua aplicao, consulte o artigo "Distribuindo suas aplicaes Qt para Linux" na segunda edio da Revista Qt. Para continuar, clique novamente no boto Next. Na prxima tela (figura 6) temos a seleo do tema de instalador, determinando que aparncia ele ter. No meu caso selecionei o Modern Wizard. Clique no boto Next para continuar. No sexto passo da criao do instalador (figura 7), selecione a plataforma para a qual est gerando o pacote de instalao. No caso do exemplo, estou gerando um pacote para instalao na plataforma Linux 32 bits. Mais uma vez, clique no Next para continuar.
figura 5
Laboratrio :: InstallJammer
figura 6
figura 7
Laboratrio :: InstallJammer
O oitavo passo da criao do instalador permite que voc selecione caractersticas adicionais ao seu instalador. Por default, todas as opes vm marcadas. As opes disponveis so: - Allow users to select custom components in your install - Esta opo permite que o usurio selecione uma instalao personalizada, selecionando quais componentes do pacote deseja instalar. - Include an uninstaller - Com esta opo marcada, o instalador de sua aplicao incluir um desinstalador. Detalhando o comportamento do desinstalador, temos as opes: - Add the uninstaller to the Windows Add/Remove Program Registry - se esta opo estiver marcada o usurio ser capaz de remover a aplicao pelo Painel de Controle do Windows. - Add a Windows Program shortcut component for the uninstaller - se esta opo estiver marcada ser criado pelo Windows um atalho para o desinstalador da aplicao.
figura 8
- Add a View Readme checkbutton - adiciona ao instalador um check box com a opo para abrir o arquivo readme (leia-me). - Add a Launch Application checkbutton - inclui um check box para executar a aplicao ao final da instalao. - Add a Create Desktop Shortcut checkbutton - inclui check box com a opo de criar um atalho para a aplicao no Desktop. Revista Qt - Janeiro/Fevereiro-2011 [35]
Laboratrio :: InstallJammer
- Add a Create Quick Launch checkbutton - inclui um check box com a opo para criar um atalho para a aplicao na barra de lanamento rpido do sistema operacional. Clique no boto Next para continuar. Chegamos ao passo final para criao do instalador. Nesta tela temos apenas o aviso de que o InstallJammer est pronto para montar instalador. Clique no boto Finish. Na tela mostrada na figura 10 temos um resumo com as opes do instalador que est sendo criado. Clique em Components and Files para expandir suas opes, e em seguida clique em Groups and Files. Sero mostrados os arquivos que esto no diretrio da aplicao. Por default, todos os arquivos encontram-se selecionados. Desmarque os arquivos que no deseja que faam parte de sua aplicao. No caso do nosso exemplo, desmarquei os arquivos com a extenses .o, .cpp e .h, alm do Makefile (figuras 11 e 12). Como a minha aplicao ser executada pelo script start (veja o artigo "Distribuindo suas aplicaes Qt para Linux" na segunda edio da Revista Qt), alterei a opo "Program Executable" que fica em "General Information -> Platform Information". Substitui <%InstallDir%>/Agenda por <%InstallDir%>/start (veja as figuras 13 e 14).
figura 9
Laboratrio :: InstallJammer
figura 10
figura 11
Laboratrio :: InstallJammer
figura 12
figura 13
Laboratrio :: InstallJammer
figura 14
figura 15
Laboratrio :: InstallJammer
Neste ponto podemos montar o nosso instalador. Para isso, selecione a opo Build -> Build Install do menu do InstallJammer (figura 15). O Install Jammer vai criar um executvel para instalao da sua aplicao, que pode ser ento distribuido para seus usurios.
figura 16
Vimos neste artigo apenas as opes bsicas do InstallJammer necessrias para a criao de um instalador. Cada tela do instalador pode ser customizada, mas para apresentar todas as opes disponveis precisaramos de uma edio exclusiva da Revista. Sugiro que voc explore as opes do InstallJammer verificando como afetam o instalador de sua aplicao.
figura 17
Iniciando na Programao com QML Bem vindo ao mundo do QML, a linguagem declarativa de Interfaces de Usurios (UI - User Interfaces). Neste guia de iniciao, vamos criar um aplicao simples de editor de textos usando QML. Depois de ler este guia, voc dever estar pronto para desenvolver suas prprias aplicaes usando QML e Qt com C++. QML para montar interfaces A aplicao que construiremos um simples editor de textos que ir carregar, salvar e desempenhar algumas manipulaes de textos. Este guia consistir de duas partes. A primeira envolver desenhar o layout da aplicao e seus Revista Qt - Janeiro/Fevereiro-2011 [41]
Para implementar a funcionalidade de click do boto, podemos usar a manipulao de eventos do QML. Manipulao de eventos QML muito similar ao mecanismo de signal e slot do Qt. Signals so emitidos e o slot conectado chamado.
Rectangle{ id:simplebutton ... MouseArea{ id: buttonMouseArea anchors.fill: parent //ancora todos os lados da rea do mouse do retngulo //onClicked manipula cliques vlidos no boto do mouse onClicked: console.log(buttonLabel.text + " clicked" ) } } Incluimos um elemento MouseArea em nosso simplebutton. Elementos MouseArea descrevem a rea interativa onde os movimentos do mouse so detectados. Para nosso boto, ancoramos toda a MouseArea ao seu pai, que simplebutton. A sintaxe "anchors.fill" uma forma de acessar uma propriedade especifca chamada fill dentro de um grupo de propriedades chamado anchors. QML usa layouts baseados em ncoras onde itens podem ser ancorados a outro item, criando layouts robustos. A MouseArea tem muitos manipuladores de sinais que so chamados durante os movimentos do mouse dentro dos limites especificados da MouseArea. Um deles "onClicked" e chamado sempre que um boto aceitvel do mouse clicado, o clique esquerdo sendo o default. Ns podemos vincular aes para o manipulador onClicked. Em nosso exemplo, "console.log()" mostra texto sempre que se clica na rea do mouse. A funo "console.log()" uma ferramenta til para fins de depurao e para mostrar texto. O cdigo no "SimpleButton.qml" suficiente para mostrar um boto na tela e exibir o texto "clicked" quando o boto for clicado com o mouse.
Rectangle { id:Button ... property color buttonColor: "lightblue" property color onHoverColor: "gold" property color borderColor: "white" signal buttonClick() onButtonClick: { console.log(buttonLabel.text + " clicked" ) } MouseArea{ onClicked: buttonClick() hoverEnabled: true onEntered: parent.border.color = onHoverColor onExited: parent.border.color = borderColor } // determina a cor do boto pelo uso o operador condicional color: buttonMouseArea.pressed ? Qt.darker(buttonColor, 1.5) : buttonColor } Um boto completamente funcional est no arquivo Button.qml. Os trechos de cdigo neste artigo tm algum cdigo omitido, denotados por reticncias ou porque eles foram introduzidos em sees anteriores ou irrelevantes para a discusso do cdigo atual. Propriedades personalizadas so declaradas usando a sintaxe de nome do tipo da propriedade. No cdigo, a propriedade buttonColor, do tipo color, declarada e vinculada ao valor "lightblue". Revista Qt - Janeiro/Fevereiro-2011 [45]
\\importa o mdulo principal Qt QML \\importa o contedo da pasta \\importa um arquivo Javascript e o nomeia como Script
A sintaxe mostrada acima mostra como usar a palavra-chave import. Isto requerido para usar arquivos Javascript, ou arquivos QML que no esto dentro do mesmo diretrio. Desde que "Button.qml" esteja no mesmo diretrio que "FileMenu.qml", no precisamos importar o arquivo "Button.qml" para utiliz-lo. Podemos criar um elemento "Button" declarando "Button{}", similiar declarao "Rectangle{}".
Row{ anchors.centerIn: parent spacing: parent.width/6 Button{ id: loadButton buttonColor: "lightgrey" label: "Load" } Button{ buttonColor: "grey" id: saveButton label: "Save" } Button{ id: exitButton label: "Exit" buttonColor: "darkgrey" onButtonClick: Qt.quit() } }
A declarao "Row" feita em um "Rectangle", criando um continer retngulo para uma linha de botes. Este retngulo adicional cria uma forma indireta de organizar a linha de botes dentro do um menu. A declarao do menu "edit" muito similar nesta fase. O menu tem botes que possuem rtulos: Copiar, Colar e Selecionar tudo.
VisualItemModel{ id: menuListModel FileMenu{ width: menuListView.width height: menuBar.height color: fileColor } EditMenu{ color: editColor width: menuListView.width height: menuBar.height } } O elemento ListView mostrar um modelo de acordo com um representante (data view). ListView{ id: menuListView //ncoras so definidas para reagir Anchors s ncoras da janela anchors.fill:parent anchors.bottom: parent.bottom width:parent.width height: parent.height //model contm os dados model: menuListModel //controla o movimento de mudana do menu Revista Qt - Janeiro/Fevereiro-2011 [51]
Adicionalmente, "ListView" herda de "Flickable", fazendo a lista responder a objetos arrastados pelo mouse e outros movimentos. A ltima parte do cdigo acima "seta" as propriedades para criar o movimento de flick desejado nossa visualizao. Em particular, a propriedade "highlightMoveDuration" altera a durao da transio flick. Um valor de "highlightMoveDuration" mais alto resulta em uma mudana de menu mais lenta. O "ListView" mantm os itens do modelo atravs de um ndice e cada item visual no modelo acessvel atravs do index, na ordem da declarao. Mudar o "currentIndex" efetivamente muda o item destacado na "ListView". O cabealho de nossa barra de menu exemplifica este efeito. Existem dois botes em uma linha, ambos mudando o menu corrente quando clicados. O "fileButton" muda o menu corrente para o menu file quando clicado, o ndice sendo 0 (zero) porque FileMenu declarado primeiro em "menuListModel". Similarmente, o "editButton" mudar o menu corrente para o "EditMenu" quando clicado. O retngulo "labelList" tem um valor "z" de "1", denotando que ele mostrado na frente da barra de menu. Items com maior valor de z so mostrados na frente daqueles itens com valores z mais baixos. O valor default de z 0 (zero).
Rectangle{ id: labelList ... z: 1 Row{ anchors.centerIn: parent spacing:40 Button{ label: "File" id: fileButton ... onButtonClick: menuListView.currentIndex = 0 } Button{ id: editButton label: "Edit" ... onButtonClick: menuListView.currentIndex = 1 } } } A barra de menu que acabamos de criar pode ser movimentada para acessar os menus pelo clique nos nomes dos menus no topo. A troca de telas de menu parece intuitiva e responsiva.
function ensureVisible(r){ if (contentX >= r.x) contentX = r.x; else if (contentX+width <= r.x+r.width) contentX = r.x+r.width-width; if (contentY >= r.y) contentY = r.y; else if (contentY+height <= r.y+r.height) contentY = r.y+r.height-height; }
Combinando componentes para o Editor de Textos Agora estamos prontos para criar o layout do nosso editor de textos usando QML. O editor de textos tem dois componentes, a barra de menus que ns criamos e a rea de texto. QML permite-nos reutilizar componentes, simplificando o nosso cdigo portanto, pela importao de componentes e personalizao quando necessrio. Nosso editor de textos divide a janela em duas; um tero da tela dedicado barra de menu e dois teros da tela mostram a rea de texto. A barra de menu mostrada na frente de quaisquer outros elementos. Rectangle{ id: screen width: 1000; height: 1000 //a tela particionada entre MenuBar e TextArea. 1/3 da tela atribuido ao MenuBar Revista Qt - Janeiro/Fevereiro-2011 [55]
Mudanas de estado so abruptas e precisam de transies mais suaves. Transies entre estados so definidas usando o elemento Transition, que pode ser vinculado s propriedades "transitions" do item. Nosso editor de textos tem uma transio de estado sempre que o estado muda para DRAWER_OPEN ou DRAWER_CLOSED. Importante: a transio precisa de um estado from (de) e um estado to (para) mas para nossas transies, podemos usar o smbolo coringa * para denotar que a transio se aplica a todas as mudanas de estado. Durante transies, podemos atribuir animaes s mudanas de propriedades. Nosso menuBar troca de posio de y:0 para y:-partition e podemos animar esta transio usando o elemento "NumberAnimation". Declaramos que a Revista Qt - Janeiro/Fevereiro-2011 [59]
void DialogPlugin::registerTypes(const char *uri){ qmlRegisterType<Directory>(uri, 1, 0, "Directory"); qmlRegisterType<File>(uri, 1, 0,"File"); } Q_EXPORT_PLUGIN2(FileDialog, DialogPlugin); A funo "registerTypes()" registra nossas classes "File" e "Directory" no QML. Esta funo precisa do nome da classe para seu template, um nmero maior de verso, um nmero menor de verso, e um nome para nossa classe. Precisamos exportar o plugin usando a macro Q_EXPORT_PLUGIN2. Observe que em nosso arquivo dialogPlugin.h, temos a macro Q_OBJECT no topo de nossa classe. Tambm precisamos executar qmake no arquivo de projeto para gerar o cdigo meta-objeto necessrio . Criando propriedades em uma classe C++ Podemos criar elementos QML e propriedades usando C++ e o sistema de meta-objetos de Qt. Podemos implementar propriedades usando slots e signals, fazendo Qt tomar conhecimento destas propriedades. Estas propriedades podem ser usada em QML. Revista Qt - Janeiro/Fevereiro-2011 [65]
Para o editor de textos, precisamos ser capazes de carregar e salvar arquivos. Tipicamente, estes recursos esto contidos em um dilogo de arquivo (file dialog). Felizmente, podemos usar "QDir", "QFile" e "QTextStream" para implementar leitura de diretrios e fluxos (streams) de entrada e sada. class Directory : public QObject{ Q_OBJECT Q_PROPERTY(int filesCount READ filesCount CONSTANT) Q_PROPERTY(QString filename READ filename WRITE setFilename NOTIFY filenameChanged) Q_PROPERTY(QString fileContent READ fileContent WRITE setFileContent NOTIFY fileContentChanged) Q_PROPERTY(QDeclarativeListProperty<File> files READ files CONSTANT ) ... A classe "Directory" usa o Sistema de "Meta-Objeto" de Qt para registrar propriedades necessrias para realizar manipulao de arquivos. A classe "Directory" exportada como um plugin e utilizvel em QML como um elemento "Directory". Cada uma das propriedades listadas usando a macro Q_PROPERTY uma propriedade QML. A macro Q_PROPERTY declara uma propriedade e tambm suas funes de leitura (read) e escrita (write) no Sistema de Meta-Objetos do Qt. Por exemplo, a propriedade filename, do tipo "QString" pode ser lida usando a funo filename() e escrita usando a funo "setFileName()". Adicionalmente, existe um signal associado propriedade filename chamado "filenameChanged()", que emitido sempre que a propriedade muda. As funes de leitura e escrita so declaradas como pblicas no arquivo de cabealho. De modo semelhante, temos as outras propriedades declaradas de acordo com seus usos. A propriedade "filesCount" indica o nmero de arquivos em um diretrio. A propriedade "filename" definida para o nome do arquivo selecionado e
Executando o editor de textos Precisamos compilar o plugin de dilogo de arquivos C++ antes que o editor de textos possa ser executado. Para compilar, entre no diretrio gsQml, ento execute qmake e compile usando make ou nmake, dependendo da sua plataforma. Para executar, rode o qmlviewer e abra o arquivo texteditor.qml. O cdigo fonte est no diretrio examples/tutorials/gettingStarted/gsQml da instalao do Qt.
Allen B. Downey professor de Cincia da Computao e gentilmente permitiu a publicao da traduo de seu livro "How to think like a computer science" na Revista Qt. O endereo do seu site o http://allendowney.com/.
Um compilador um programa que l um programa em alto nvel e traduz tudo de uma vez, antes de executar qualquer comando. Frequentemente voc compila o programa em um passo separado, e ento executa o cdigo compilado depois. Neste caso, o programa de alto nvel chamado de cdigo fonte, e o programa traduzido chamado de cdigo objeto ou o executvel. Como um exemplo, suponha que voc escreva um programa em C++. Voc usa um editor de textos para escrever o programa (um editor de textos um simples processador de palavras). Quando o programa est pronto, voc deve salvalo em um arquivo chamado programa.cpp, onde "programa" um nome arbitrrio inventado por voc, e o sufixo .cpp uma conveno que indica que o arquivo contm cdigo fonte C++.
O prximo passo executar o programa, o que requer algum tipo de executor. O papel do executor carregar o programa (copia-lo do disco para a memria) e fazer o computador iniciar a execuo do programa. Embora este processo possa parecer complicado, a boa notcia que na maioria dos ambientes de programao (algumas vezes chamados ambientes de desenvolvimento), estes passos so automatizados para voc. Comumente voc ter apenas que escrever um programa e digitar um simples comando para compil-lo e execut-lo. Por outro lado, til saber quais so os passos que esto acontecendo "por trs", de modo que se algo der errado, voc possa descobrir do que se trata.
No entanto, o compilador pode ser uma ferramenta til para aprender regras de sintaxe de uma linguagem Comeando com um programa funcional (como hello.cpp), modifique-o de vrias formas e veja o que acontece. Se voc obtiver uma mensagem de erro, tente lembrar-se do que diz a mensagem e o que causou, ento se voc a ver novamente no futuro, saber o que significa. Glossrio linguagem de baixo nvel: Uma linguagem de programao que projetada para ser fcil para o computador executar. Tambm chamada "linguagem de mquina" ou "linguagem assembly" portabilidade: Uma propriedade de um programa que pode ser executado em mais de um tipo de computador. linguagem formal: Qualquer uma das linguagens que as pessoas projetaram para propsitos especficos, como representao de idias matemtica ou programas de computador. Todas as linguagens de programao so linguagens formais. linguagem natural: Qualquer um das lnguas que as pessoas falam que evoluiram naturalmente. interpretar: A traduo de um linha de cada vez, usada para executar um programa escrito em uma linguagem de alto nvel. compilar: Traduzir um programa em uma linguagem de alto nvel para uma linguagem de baixo nvel, todo de uma vez, preparando-o para execuo futura. source code: A program in a high-level language, before being compiled. Cdigo objeto: A sada do compilador, depois da traduo do programa. executvel: Outro nome para o cdigo objeto que est pronto para ser executado.
algortmo: Um processo geral de soluo para uma categoria de problemas. bug: Um erro em um programa. sintaxe: A estrutura de um programa. semntica: O significado de um programa. parse: Examinar um program e analizar a estruutra sinttica. erro de sintaxe: Um erro em um programa que torna impossvel realizar o parse (e consequentemente impossvel de compilar). erro em tempo de execuo: Um erro em um programa que o faz falhar na execuo. erro de lgica: Um erro em um programa que o faz executar uma coisa diferente daquela pretendida pelo programador. debugar: O processo de encontrar e remover qualquer um dos trs tipos de erros.