C++ com Qt4. Tomaz Martins dos Santos Canabrava



Documentos relacionados
Barra de ferramentas padrão. Barra de formatação. Barra de desenho Painel de Tarefas

Na disciplina de Cálculo Numérico, vamos trabalhar com a linguagem C++ e o compilador que vamos usar é o Dev C++.

Desenvolvendo Websites com PHP

Operador de Computador. Informática Básica

APOSTILA DE EXEMPLO. (Esta é só uma reprodução parcial do conteúdo)

Gerenciamento de Arquivos e Pastas. Professor: Jeferson Machado Cordini jmcordini@hotmail.com

Dicas para usar melhor o Word 2007

Lazarus pelo SVN Linux/Windows

Resumo da Matéria de Linguagem de Programação. Linguagem C

Sumário 1. SOBRE O NFGoiana DESKTOP Apresentação Informações do sistema Acessando o NFGoiana Desktop

Orientação a Objetos Programação em C++

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

Celebre este natal e ano novo junto aos seus amigos e familiares distantes.

Manual Sistema MLBC. Manual do Sistema do Módulo Administrativo

ArpPrintServer. Sistema de Gerenciamento de Impressão By Netsource Rev: 02

Google Drive: Acesse e organize seus arquivos

Lógica de Programação

MANUAL DE FTP. Instalando, Configurando e Utilizando FTP

SUMÁRIO TUTORIAL DO HQ. 2 DICAS PEDAGÓGICAS:. 2 DOWNLOAD DA INSTALAÇÃO. 2 PASSO 1 FORMULÁRIO PARA DOWNLOAD. 2 PASSO 2 ESCOLHENDO A VERSÃO.

2. O AMBIENTE DE PROGRAMAÇÃO EM C

Manual do Usuário Android Neocontrol

Orientação a Objetos

INTRODUÇÃO AO WINDOWS

Manual de Utilização do Zimbra

1. Instalei o DutotecCAD normalmente no meu computador mas o ícone de inicialização do DutotecCAD não aparece.

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Memória Flash. PdP. Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos

OneDrive: saiba como usar a nuvem da Microsoft

Manual Sistema de Autorização Online GW

MANUAL DO ANIMAIL Terti Software

CURSO DE INFORMÁTICA BÁSICA AULA 2 O AMBIENTE WINDOWS

Programação Orientada a Objetos com PHP & MySQL Sistema Gerenciador de Banco de Dados: Introdução e configuração de bases de dados com Postgre e MySQL

Noções de. Microsoft SQL Server. Microsoft SQL Server

Manual de configuração do sistema

Algoritmos e Programação Estruturada

Básico, Ferramentas e o Primeiro Programa em Qt

Planejando o aplicativo

Google Drive. Passos. Configurando o Google Drive

Algoritmos em Javascript

Como incluir artigos:

SUMÁRIO 1. AULA 6 ENDEREÇAMENTO IP:... 2

É o UniNorte facilitando a vida de nossos docentes e discentes.

Componentes da linguagem C++

Fluxo de trabalho do Capture Pro Software: Indexação de código de barras e separação de documentos

Manual de Utilização do Sistema GRServer Cam on-line (Gerenciamento de Câmeras On-line)

2 Orientação a objetos na prática

UNIVERSIDADE FEDERAL DE GOIÁS CERCOMP (CENTRO DE RECURSOS COMPUTACIONAIS) TUTORIAL DE USO DO WEBMAIL - UFG

2 echo "PHP e outros.";

Revisão: Introdução. - Integração com o AutoManager; 1 Atualização de versão do banco de dados PostgreSQL

Despachante Express - Software para o despachante documentalista veicular DESPACHANTE EXPRESS MANUAL DO USUÁRIO VERSÃO 1.1

NetEye Guia de Instalação

O Windows 7 é um sistema operacional desenvolvido pela Microsoft.

Na tela dele, clique no sinal de + ao lado do nome do seu computador, para expandi-lo. A seguir, expanda também o item "Sites da web".

Tutorial: Instalando Linux Educacional em uma maquina virtual

Daruma NFCe Conheça todos os passos para testar a NFCe Daruma

Capacitação Aula4: Utilizando o Imagination e o Avidemux (GTK+)

O Windows 7 é um sistema operacional desenvolvido pela Microsoft.

Manual Captura S_Line

Manual Equipamento ST10 Flasher Rev. 1

RESTAURAÇÃO NO WINDOWS 8

PROJETO INFORMÁTICA NA ESCOLA

Atualização do seu computador com Windows 8 da Philco para o Windows 8.1

Procedimentos para Reinstalação do Sisloc

Configurando um Grupo Doméstico e Compartilhando arquivos no Windows 7

Instalando o Lazarus e outros sistemas de suporte. Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2011

Introdução. O que é o Registro do Windows

Manual do Google agenda. criação e compartilhamento de agendas

AULA: BrOffice Impress terceira parte. Ao final dessa aula, você deverá ser capaz de:

Introdução a Banco de Dados

Serviço Técnico de Informática. Curso Básico de PowerPoint

Como atualizar os preços da ABCFarma.

02 - Usando o SiteMaster - Informações importantes

Tela Principal. 2) Criação do CD para ser entregue ao cliente.

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

CONFIGURAÇÃO MINIMA EXIGIDA:

Fluxo de trabalho do Capture Pro Software: Indexação de OCR e separação de documentos de código de correção

Introdução à Programação

atube Catcher versão 3.8 Manual de instalação do software atube Catcher

Lição 1 - Criação de campos calculados em consultas

Fundamentos de Programação II. Introdução à linguagem de programação C++

JBOLETO GENERATOR A maneira mais fácil para trabalhar com boletos bancários. Agradecimentos

Universidade Federal de Santa Maria UFSM Centro de Tecnologia CT. Power Point. Básico

INFORMÁTICA APLICADA AULA 02 LINGUAGEM DE PROGRAMAÇÃO C++

Área de Trabalho. Encontramos: Ìcones Botão Iniciar Barra de Tarefas

Criando um script simples

Programação Orientada a Objetos com PHP & MySQL Cookies e Sessões. Prof. MSc. Hugo Souza

10 DICAS DE TECNOLOGIA PARA AUMENTAR SUA PRODUTIVIDADE NO TRABALHO

LINGUAGEM C UMA INTRODUÇÃO

MANUAL DE UTILIZAÇÃO

Manual do Instar Mail v2.0

Instalando o Internet Information Services no Windows XP

1) Ao ser executado o código abaixo, em PHP, qual será o resultado impresso em tela?

Manual de Instalação. Windows XP. Desenvolvedores: Patrick Duarte, Rodrigo dos Santos. Setembro de 2014.

Manual AGENDA DE BACKUP

Atualizaça o do Maker

Fique craque com estas dicas para o Gerenciador de tarefas do Windows

CRIANDO BANCOS DE DADOS NO SQL SERVER 2008 R2 COM O SQL SERVER MANAGEMENT STUDIO

3. No painel da direita, dê um clique com o botão direito do mouse em qualquer espaço livre (área em branco).

Organização do Curso. Instalação e Configuração. Módulo II. Pós Graduação em Projeto e Gerencia de Redes de Computadores

Transcrição:

C++ com Qt4 Tomaz Martins dos Santos Canabrava 12/01/2009

2

Conteúdo 1 Principio 5 1.1 Introdução................................... 5 1.1.1 Para quem é esse livro?........................ 5 1.2 Instalando o compilador e o Qt........................ 6 1.2.1 Windows................................. 6 1.2.2 OS X................................... 8 1.2.3 Linux................................... 11 1.2.4 Instalando e Configurando IDE s................... 11 2 Relembrando C++ 13 2.1 Programadores................................. 13 2.2 Não Programadores.............................. 13 2.3 Primeiro Programa em C++.......................... 13 2.4 Variaveis..................................... 14 2.4.1 Tipos de dados............................. 15 2.5 Ponteiros e Vetores............................... 16 2.6 Referências................................... 17 2.7 Controle de Fluxo............................... 18 2.7.1 for.................................... 18 2.7.2 while................................... 19 2.7.3 do..while................................. 19 2.7.4 if..else.................................. 20 2.7.5 switch.................................. 21 2.7.6 goto................................... 22 2.7.7 Operador?:............................... 22 2.7.8 recursão................................. 23 2.7.9 Funções e Retorno........................... 23 2.8 Orientacao a Objeto.............................. 24 2.8.1 classes.................................. 24 2.8.2 Herança e Polimorfismo........................ 26 3 Qt Básico 31 3.1 História do Qt................................. 31 3.2 Tecnologias no Qt............................... 33 3

4 CONTEÚDO 3.2.1 WebKit.................................. 33 3.2.2 Phonon................................. 34 3.2.3 SQL................................... 35 3.2.4 Internacionalização.......................... 35 3.2.5 CSS................................... 36 3.2.6 Networking............................... 36 3.2.7 Scripts.................................. 36 3.3 Iniciando nos tortuosos caminhos do Qt.................. 37 3.3.1 Meta Objects.............................. 37 3.3.2 Sinais e Slots.............................. 37 3.3.3 Programando: Controlando um botão................ 38 3.4 Programando uma Calculadora....................... 44 3.5 Usando Criador de Interfaces........................ 59

Capítulo 1 Principio 1.1 Introdução Comecei a escrever esse livro em um dia que percebi que além de não haver muito interesse em c++ nas universidades e faculdades que visito, a visão da linguagem é que é complicada, difícil de ser utilizada. um professor de certa instituição de ensino chegou a me dizer que C++ é uma linguagem morta, ninguém mais quer programar nisso. o futuro é Java., não pretendo fazer guerras de linguagem, mas eu pessoalmente só conheço 2 programas em java, eles são IDE s para programação em Java (...). Não irei ensinar a programar. não é meu intuito. irei levar o leitor a conhecer algumas sutilezas do c++ em uma visita rápida a linguagem utilizando as formas mais rápidas de aprendizado que conheço, mas sendo eu também um estudante poderei me enganar na abordagem, por favor, sejam pacientes. além de C++ obviamente estarei mostrando o Qt a partir do segundo capítulo do livro, e mostrando como a utilização do cute pode transformar a programação em algo muito mais simples de programar até do quê linguagens que são famosas por sua sintaxe concisa. sem nomes claro, *cof* java *cof*, Espero que no final do livro consiga se virar e aprender coisas que não ensino por si só, pois em alguns pontos não é necessário ensinar a pescar e sim fazer com que o pescador descubra que precisa criar uma rede, procurar ideias, sentar numa mesa e rabiscar num papel até que saia com algo que talvez sirva para pegar mais peixes que apenas uma vara com anzol. Tomaz Canabrava 1.1.1 Para quem é esse livro? Pergunta bem comum em livros de programação, já que deve ser focado em um publico específico, este livro espera que a pessoa tenha alguma base em algoritmos e um bom poder de dedução, não irei mastigar as explicações a não ser que ache realmente necessário. Não é necessário o conhecimento prévio de nenhuma linguagem antes de começar a tentar estudar por este pequeno material, mas o caminho não será o mais fácil. O livro é indicado para pessoas com algum conhecimento 5

6 CAPÍTULO 1. PRINCIPIO de linguagens de programação querendo se aventurar pelos caminhos tortuosos do c++, e ir mais fundo ainda, aprendendo Qt (cute) - uma biblioteca condensada que resolve todos os seus problemas ( menos aqueles em que você mesmo tem que resolver, o que são muitos, como uma filha grávida. ). Espero que ao ler este livro, Você - querido leitor - consiga, a partir de um pensamento abstrato, dar vida a suas criações e deixar seus colegas de trabalho ou faculdade (ou até escola mesmo, sei lá se é um superdotado da vida) de boca aberta com programas de qualidade, e com botões que clicam*. *sim... eu fiquei com vontade de deixar meus colegas de faculdade de boca aberta no momento que consegui fazer meu primeiro botão clicante em c++. 1.2 Instalando o compilador e o Qt. Figura 1.1: Qt Vai bem na parede. Tentarei explicar passo a passo como instalar e configurar o Qt 4.4+ e o GCC nas três plataformas mais usadas, Embora minha experiência pessoal seja apenas em Linux e OSX, o Windows também será levado em conta, pois ainda representa 92% dos desktops e eu seria um pouco ignorante ignora-lo. (cacofonia?) 1.2.1 Windows Figura 1.2: Qt Vai bem também em janelas. Por favor, vá ao site do qt e pegue a versão opensource compilada com o MinGW. isso irá te tirar muita dor de cabeça. Figura 1.3: Site do Qt. O endeço caso não consiga ler é http://www.trolltech.com O arquivo de instalação do Qt possui aproximadamente 100 megas, além disso provavelmente irá baixar também o pacote mingw, verifique se possui mais de 1gb livre em disco pois a compactação do instalador é muito boa e irá usar muito espaço em disco para colocar tudo em seus devidos lugares.

1.2. INSTALANDO O COMPILADOR E O QT. 7 Figura 1.4: Lembre-se de escolher download opensource. Figura 1.5: Link selecionado e baixando o arquivo. Figura 1.6: Abrindo o Instalador Figura 1.7: Licença GPL2.0 Figura 1.8: Instalar o Compilador de C++? Até o instalador temrinar de abrir leva tempo, tenha paciência. *LEIA* A Licença. No meio da instalação ele irá te pedir para indicar em qual pasta está o MinGW - um pacote de compiladores da família GCC para Windows ( GNU Compiller Collection ), e caso não exista, te permite fazer o download e instalação por ali mesmo. é mais prático mandar instalar caso você não tenha certeza do que está acontecendo. Obs, Se você tem DevC++, CodeBlocks eles funcionam como deveriam, seu computador já possui MinGW. O Qt roda também sem problemas com o Visual Studio, mas isso não será tratado no livro, pois não tenho uma copia do mesmo. o problema é que ao término da instalação tudo deveria estar pronto para uso, mas não, agora temos que meter a mão nas variáveis de ambiente do Windows, coloque luvas. Figura 1.9: Propriedades do Windows vá em meu computador, propriedades, Figura 1.10: Variáveis de Ambiente

8 CAPÍTULO 1. PRINCIPIO depois em avançado, variáveis de ambiente. Figura 1.11: Editando o PATH Em variáveis do ambiente, procure por PATH, e adicione no final o local de instalação do Qt e do MinGW. isso é normalmente em c:/qt4.4.3/bin e c:/mingw/bin clique em Ok, e está feito. Pule pra o ultimo trecho deste capitulo, sim? 1.2.2 OS X Figura 1.12: Qt Também vai bem em maçãs. Para trabalhar com programação no OSX, é necessário que você instale o Developer Tools. O pacote instalador encontra-se no Segundo CD do Tiger e no DVD do Leopard. Sistemas abaixo do Tiger não são suportados pelo Qt. Por favor, vá ao site do qt e pegue a versão opensource compilada para OSX. isso irá te tirar muita dor de cabeça. o download tem aproximadamente 100 megas, mas depois de instalado ocupa quase 1gb, verifique se tem espaço no disco. Figura 1.13: Site do Qt O endereço caso não consiga ler é http://www.qtsoftware.com O site do Qt tem muita coisa legal. Siga a setinha vermelha para ir a parte opensource do site. e escolha qt para aplicações, senão você acabará fazendo aplicativos para despositivos móveis. Escolha a versão para mac. - baixe o arquivo e lembre-se de onde salvou. no OSX a maioria das coisas são salvas no desktop.

1.2. INSTALANDO O COMPILADOR E O QT. 9 Figura 1.14: Parte Opensource do Site. Figura 1.15: Escolha Qt for Applications Figura 1.16: Escolha Qt for Applications Figura 1.17: Escolha o arquivo.dmg clique no download e espere terminar. Agora, monte o disco do Qt

10 CAPÍTULO 1. PRINCIPIO Figura 1.18: Escolha o arquivo.dmg Figura 1.19: Escolha o arquivo.dmg Figura 1.20: Iniciando a instalação. aguarde até o final da instalação. (a) (b) (c) Figura 1.21: Continuando a instalação. continue aguardadno. ao fim da instalação, seu Qt está pronto para uso.

1.2. INSTALANDO O COMPILADOR E O QT. 11 (a) (b) (c) Figura 1.22: Fim da instalação. 1.2.3 Linux A depender da sua distribuição linunx, a forma varia. irei colocar aqui apenas a forma para Distribuições baseadas em Debian como o Ubuntu, Kubuntu, Mint e gos. Existem Linux de todos os tamanhos, cores e sabores. Verifique com sua distribuição qual a melhor forma de instalar os pacotes do Qt. no debian o comando é sudo aptitude install libqt4-devel build-essentials. isso baixa, instala, configura para uso. não se precisa de fotos para um comando no terminal, né? 1.2.4 Instalando e Configurando IDE s. Como eu acho que menos da metade de vocês teria vontade de utilizar uma linguagem de programação sem uma boa IDE, desde já retiro esse medo de vocês, e aconselho o uso de algumas, organizadas por ordem de prioridade: KDevelop QtCreator Eclipse Code::Blocks Todas as IDE s Listadas estão disponíveis para todas as plataformas, menos o KDevelop que ainda está em código beta e só deve ser utilizado caso você tenha paciência para aguentar os erros que ainda existem, e se possível ajudar no desenvolvimento do programa reportando erros e dando sugestões. O KDevelop está em primeiro em relação ao QtCreator por suporte a colorização inteligente de código, e suporte a CMake que falta nos outros. Ao se desenvolver para KDE é fundamental um suporte a CMake na IDE. Caso não precise do CMake, o QtCreator é a melhor IDE em benefícios.

12 CAPÍTULO 1. PRINCIPIO Eclipse KDevelop QtCreator Code::Blocks Agora que tudo já se acertou e as IDE s estão configuradas, Crie um arquivo de texto no seu bloco de notas preferido e escreva: #include <QAplicattion> int main(int argc, char *argv[])\{ QApplication app(argc, argv); QPushButton btn("ola Mundo"); btn.show(); return app.exec(); Figura 1.23: Variáveis de Ambiente Procure como faz para compilar na sua IDE preferida, e execute. Caso haja um botão escrito hello world na sua frente, onde você clica e nada acontece, e você achou essas menos de 10 linhas de código um atraso de vida pois o Python faz isso em menos, bem, usando C++ Puro e a API do windows para abrir uma janela em branco são 80 linhas, você deveria estar feliz.

Capítulo 2 Relembrando C++ 2.1 Programadores Este livro dará uma introdução rápida ao C++ e depois pegará pesado com o uso do Qt, esteja ciente de que não irei explicar em minúcias o uso de for, while, switch. Jogarei as coisas com um exemplo mínimo e espero que você se vire para entender o que passo sem um passo a passo do que eu considerar trivial. Construtos de linguagem que só existem no c++ serão levados em consideração e explicados em detalhes, mas não confie que tudo será. A parte de C++ deste livro é mais uma forma rápida de aprender e pegar dicas do C++ que não são ensinadas em sala de aula. 2.2 Não Programadores Este livro não dará aula de programação, Se você tem duvidas quanto o uso de for, while, switch e similares é bem provável que não consiga acompanhar o livro. Ainda assim vale uma pena a leitura caso tenha força de vontade de aprender. Mas aconselho realmente o uso de um livro melhor para o ensino da linguagem. Já irei supor que sabe o que é uma estrutura ou classe, passando bem batido por eles. 2.3 Primeiro Programa em C++ Um programa minúsculo em c++, como padrão dos programas de livros da linguagem, Hello World. #include <iostream> int main(int argc, char *argv[]){ 13

14 CAPÍTULO 2. RELEMBRANDO C++ std::cout << "Hello World"; return 0; salve o arquivo como app1.cpp e compile / execute. isso depende da sua IDE. caso não esteja usando IDE, o comando para compilar é gcc -Wall -o app1 app1.cpp Explicação linha a linha: #include <iostream> #include é uma diretiva de pré processamento ( Acontece antes do código ser efetivamente compilado ) que serve para incluir o conteúdo de um arquivo dentro de outro. inclúimos o arquivo iostream que possui o comando std::cout para escrita na tela. int main(int argc, char *argv[]) É o ponto de entrada do programa. os dois parâmetros que recebe são a quantidade de parâmetros, e os parâmetros em si na hora de invocar o programa. por exemplo, ao se usar um comando ping 192.168.0.1, o argv recebe 2, e o argc recebe ping e 192.168.0.1. std::cout << "Hello World"; algumas coisas... o comando é cout, e não std::cout. o std é o namespace onde o comando cout se encontra. um namespace é apenas uma forma de separação de variáveis em pacotes. Parecido com o package do java, só que mais poderoso. o comando :: é operador de escopo, ele indica de qual pacote o comando ou a variável pertence. std significa standard, é parte do pacote padrão do c++. o operador <<significa shift left, ou em bom português Empurre o valor dessa variável para dentro dessa outra. Então, ele empurra o nosso Oi Mundo para o comando que coordena a entrada de dados no monitor. Então ele aparece na tela, Mágico, não? return 0; sai da função e retorna 0 ao sistema operacional. zero significa normalmente uma saída sem erros. 2.4 Variaveis Os tipos de variáveis em c++ que são definidos na linguagem são apenas inteiros de tamanhos de bits diferentes. isso inclui o bool e o char. Como tudo para C e C++

2.4. VARIAVEIS 15 não passa de uma sequência de números binários que são interpretados de formas diferentes, um char é um numero, um int também. um double mais ainda. Nome Descrição Tamanho Range char Letra 1byte -128 até 127 int Inteiro Pequeno 2bytes -32768-32767 int Inteiro. 4bytes -2147483648-2147483647 bool Valor booleano 1byte true or false float Numero Real. 4bytes double Real mais preciso 8bytes [2] Tabela 2.1: Tipos de dados puros do C++ unsigned utiliza o bit mais significativo como numero, e não sinal. signned utiliza o bit mais significativo como sinal, e não numero. long dobra o tamanho da variavel. short utiliza a metade do tamanho da variável. não serve para ser usado em char, pois a menor quantidade de bits que o c++ manipula são 8 por vez. 2.4.1 Tipos de dados char int float double e todos os outros tipos são definidos a partir desses. para iniciar uma varável em C++, basta dizer o tipo e identificação. int main{ int i = 32; double f = 44; char c = 20; int z = a ; explicação Linha a linha: int i = 32; cria um int e atribui o valor 32 a ela.

16 CAPÍTULO 2. RELEMBRANDO C++ double f = 44; cria um double e atribui 44 a ela. char c = 20; cria um caractere e atribui o valor 20 a ele. como em C++ tudo é numero, 20 é um valor válido para char. int z = a ; cria um inteira e atribui o valor inteiro correspondente ao caractere a na tabela ASCII. 2.5 Ponteiros e Vetores Ponteiros são variáveis especiais que guardam inteiros que correspondem a endereços de memória de outras variáveis. Vetores são alocações de múltiplas variáveis de uma só vez, mas também são ponteiros-implícitos. int main{ int *ptrvetor = new int[10]; int vetor[10]; int *ptrtemporario = 0; ptrtemporario = vetor; ptrtemporario = ptrvetor; for (int i = 0; i < 10; ++i){ ptrvetor[i] = rand()\%10; vetor[i] = ptrvetor[i]+1; delete[] ptrvetor; o código acima mostra a forma de criar um vetor utilizando a forma de ponteiro e a forma padrão da linguagem. é importante notar que caso seja necessário definir o tamanho do vetor em tempo de execução do programa, a utilização em forma de ponteiro deverá ser utilizada. o ponteiro ptrtemporario foi criado apenas para mostrar que não há erros de compilação nem avisos ao se igualar um ponteiro a um ponteiro, e um vetor a um ponteiro, confirmando o que eu disse sobre serem ponteiros implícitos.

2.6. REFERÊNCIAS 17 delete[] apaga o conteudo do vetor alocado. é importante apagar as memórias alocadas já que o c++ não possui garbage-collection (ok, o java ganha nisso). ao se criar uma função recebe um ponteiro/vetor que não será modificado, é importante utilizar o modificador const na passagem do parâmetro. void naomodifica(const char* a){ ++(*a); tentando compilar esta função, o compilador irá parar com um erro: error: increment of read-only location. ( Erro: incremento em acesso somente-leitura ) portanto, em C e C++ deve-se utilizar o const ao passar parâmetros de ponteiros que não devem ser modificados, como uma string ( char ) em uma função que deve só contar as letras. como um vetor é um ponteiro, a construção abaixo que conta o numero de letras é válido. int strsize(char *str){ int size = 0; while( (*str)!= \0 ){ ++size; ++str; return size; 2.6 Referências São a terceira forma de variáveis do C++. no Java tudo são referências, no C temos variáveis ou Ponteiros. no C++ temos os três tipos. a importância da referência é grande. ela evita a duplicação de memória alocada com valores iguais, criando uma alias nova para uma variável antiga e manipulando a original pela alias. Em c, para se modificar o valor de uma variável por uma função, passa-se o ponteiro. irei criar a mesma função de descobrir as raízes de uma equação de segundo grau em C e em C++ para mostrar melhor as diferenças. Como uma equação de segundo grau tem dois resultados, não posso utilizar o return pois ele volta apenas um valor, utilizarei uma forma diferente então para obter os valores que preciso. em C usando ponteiros e em C++ usando referencias. em C

18 CAPÍTULO 2. RELEMBRANDO C++ void eqsegundograu(int a, int b, int c, double *r1, double *r2){ double delta = b * b - 4 * a * c; // calculo do delta. (*r1) = (-b + sqrt(delta)) / (2 * a); (*r2) = (-b - sqrt(delta)) / (2 * a); em C++ void eqsegundograu(int a, int b, int c, double& r1, double& r2){ double delta = b * b - 4 * a * c; // calculo do delta. r1 = (-b + sqrt(delta)) / (2 * a); r2 = (-b - sqrt(delta)) / (2 * a); visualmente, o código é bem semelhante, mas por trás o uso de referências alocou dois espaços a menos de memória que a versão em C. o r1 e r2 usados no C são variáveis locais. enquanto o r1 e o r2 utilizados no c++ são referências para variáveis fora do escopo da função. esse espaço de memória ( dois ints no caso do C ) não precisaram ser alocados, economizando espaço, processamento e facilitando a clareza de código.( ( variavel) X variavel. ) 2.7 Controle de Fluxo controle de fluxo do c++ é exatamente igual ao do C. as construções são for, while, do..while, if, else, switch..case,?:, goto, e recursão. 2.7.1 for for é uma iteração que começa em um determinado valor e vai avançando até outro valor pré-estabelecido e o calculo de como será o crescimento. portanto, para escrever os números pares de 0 a 10, temos for ( int i = 0; i <= 10; i += 2){ std::cout << i << " "; iniciamos uma várivel local ao for chamada i com o valor zero, o for irá rodar até que i seja 10. e somamos 2 a cada iteração do for. o resultado disso será 0 2 4 6 8 10 podemos também escrever de 10 a zero invertendo o for.

2.7. CONTROLE DE FLUXO 19 for ( int i = 10; i >= 0; i -= 2){ std::cout << i << " "; 10 8 6 4 2 0 completamente previsível. Mas o for não é sempre tão simples de usar. pois nenhum dos campos do for é obrigatório. for (;;) é uma construção válida no C e cria um loop infinito. 2.7.2 while o while cria um laço que se repete até que determinada ação seja falsa. char *a = "nabucodonosor"; while ( a!= \0 ){ std::cout << (*a); a++; escreverá nabucodonosor na tela. da mesma forma que o for(;;) cria um loop infinito, while (1) cria um loop infinito. as diferenças do for e do while são bem sutis, mas o while é geralmente mais rápido em tempo de execução, micronésimos de segundo mais rápido. 2.7.3 do..while as diferenças do do..while para o while são mínimas, apenas o do..while executa pelo menos uma vez, enquanto no while ele pode não ser executado. char *a = "\0\0"; do{ std::cout << (*a); while( a!= \0); irá escrever um while( a!= \0){ std::cout<< (*a); não irá escrever na tela. C++ te dá um poder de escolha, mas poderes vem acompanhados de grandes responsabilidades. use com cautela.

20 CAPÍTULO 2. RELEMBRANDO C++ 2.7.4 if..else Provavelmente os controles de fluxo de programas mais utilizado, o if executa um trecho de código apenas uma vez caso algo seja verdadeiro, e o else executa apenas caso o if seja falso. int TheAnswer = rand(); if (TheAnswer == 42){ std::cout << "Nerd." else if (TheAnswer = 666){ std::cout << "Er... pode falar disso no livro?" else{ std::cout << "Um numero que nao tinha sido pensado antes." o if / else permite escadas de código, muitas vezes é bom pensar um pouco mais no código ao invés de aceitar a escada criada. códigos como if (teste1 ){ codigo... if (teste 2){ codigo... if (teste 3){ codigo... else{ return else{ return else{ return; podem ser reescritos com uma leitura melhor. if (!teste 1){ return

2.7. CONTROLE DE FLUXO 21 if (!teste 2){ return; if (!teste 3){ return; codigo 1 codigo 2 codigo 3 2.7.5 switch em casos onde o if seria escrito da forma... if ( variavel == 1){ codigo... else if (variavel == 2){ codigo... else if(variavel == 3){ codigo... else if( variavel == 4){ codigo... else{ codigo... o switch deverá ser usado. switch(variavel){ case 1: codigo... break; case 2: codigo... break; case 3: codigo... break; case 4: codigo... break; default: codigo... break;

22 CAPÍTULO 2. RELEMBRANDO C++ ele funciona como um if mais sexy. o default é executado caso nenhum case seja. É importante lembrar de usar breaks caso queira sair da instrução de comando. 2.7.6 goto não utilize, simples assim. 2.7.7 Operador?: O Operador Ternário?: existe no C, Java, C++, C# e em tantas outras linguagens, mas independente da existência, o numero de professores que passa esse conhecimento aos alunos é tão pequeno que eu me sinto na obrigação de explicar. o?: é uma ATRIBUIÇÃO LOGICA e não um Controle de fluxo. o que eu estou tentando dizer com isso é: bool resposta; char opcao; std::cout << "Voce sabe o que e um operador ternario? s/n" << std ::endl; cin >> opcao; if (opcao == s ) { entendeu = true; else { entendeu = false; A Forma utilizada acima embora funcione está errada. representa em mais código asm criado pelo compilador, tornando o programa maior em espaço em disco, maior em utilização de memória, menos eficiente. Você pode rebater dizendo que a memória hoje em dia é virtualmente infinita e que o atraso gerado por um if tão pequeno seria ínfimo. Não precisa se preocupar com isso. é... essa falta de preocupação com a qualidade do código faz com que existam programas de torrent de 20 megas que tem menos funções e trabalham pior que o µtorrent[1] que tem 800kb, mas enfim, é seu código. a forma como eu escreveria o código acima é bool entendeu;

2.7. CONTROLE DE FLUXO 23 char opcao; std::cout << "Voce sabe o que e um operador ternario? s/n" << std ::endl; cin >> opcao; resposta = (opcao == s )? true : false; Alguns professores dizem que é de legibilidade ruim. eu não consigo ver uma legibilidade pior do quê ++a ou a++. é Obvio que qualquer programador que se preze sabe o quê significa tais construtos assim como a diferença de um ++ no inicio ou no fim, o? : te permite escrever atribuições lógicas em menos linhas de código, e se bem usado facilita o entendimento do programa. Aos professores que não gostam, que evitam falar por gerar duvida, aqui deixo minha sutíl espetada. 2.7.8 recursão A recursão em c++ é obtida ao chamar uma função dentro dela mesma, normalmente aproveitando o valor de retorno. int somatorio(int n){ if (n!= 1){ return n + somatorio( n-1 ); return 1; a cada chamada da função, o numero passado será diminuido de 1, e somado com o anterior. 2.7.9 Funções e Retorno Funções são blocos de código que tem um valor associado ( mesmo que esse valor seja a ausência dele. ) é definido da mesma forma que uma varivável, adicionando o corpo da função no fim, ex.: int delta(int a, int b, int c){ return pow(b,2) - 4*a*c; isso gera uma função delta, das equações de segundo grau. dentro dela chamamos a função pow que eleva um numero a um expoente. o resultado da conta é

24 CAPÍTULO 2. RELEMBRANDO C++ retornado, e para o valor ser aproveitado precisa que alguém, como uma variável armazene o valor. 2.8 Orientacao a Objeto 2.8.1 classes Classes em c++ são declaradas com a palavra reservada class os atributos podem ser public, private ou protected, e o c++ permite herança múltipla ( use com moderação ). Irei criar aqui em baixo uma classe de figuras geométricas e duas que herdam dela, Triângulo e Circulo. arquivo figurageometrica.h #ifndef FIGURAGEOMETRICA_H #define FIGURAGEOMETRICA_H class FiguraGeometrica{ public: FiguraGeometrica(); virtual FiguraGeometrica(); virtual double area() = 0; ; #endif arquivo triangulo.h #ifndef TRIANGULO_H #define TRIANGULO_H #include "figurageometrica.h" class Triangulo : public FiguraGeometrica{ public: Triangulo(double base, double altura); virtual Triangulo(); double area(); private: double m_base;

2.8. ORIENTACAO A OBJETO 25 ; double m_altura; #endif arquivo circulo.h #ifndef CIRCULO_H #define CIRCULO_H #include "figurageometrica.h" class Circulo : public FiguraGeometrica{ public: Circulo(double raio); virtual Circulo(); double area(); private: double m_raio; ; #endif Explicação Linha a Linha: Essa sequência de directivas de pré-compilação são necessárias em arquivos cabeçalho pois impedem que o arquivo seja processado mais de uma vez pelo compilador, gerando código duplicado e gerando erros de compilação. #ifndef FIGURAGEOMETRICA_H Essa directiva significa If Not Defined - Se não estiver definido. se FIGURAGE- OMETRICA H não estiver definido o código abaixo será executado. E sempre que o arquivo for adicionado ao código pela primeira vez, ele não estará definido, logo, o código do arquivo será executado. #define FIGURAGEOMETRICA_H Como o FIGURAGEOMETRICA H não estava definido, agora definimo-lo, impedindo que dupla insersão desse arquivo gere código duplicado. #endif

26 CAPÍTULO 2. RELEMBRANDO C++ Essa linha no fim do arquivo termina o #if iniciado pelo #ifndef. class FiguraGeometrica{ define uma nova classe chamada FiguraGeométrica. public: Abaixo dessa linha todos os atributos e métodos farão parte do escopo publico. FiguraGeometrica(); A declaração do construtor da classe é um método sem tipo que tem o mesmo nome da classe. logo, isso é a declaração do construtor. virtual FiguraGeometrica(); O indica que é o destrutor da classe. destrutores são necessários em linguagens sem garbage collector para que o programa saiba o que fazer quando a memória alocada por esta estrutura de dados precisar reintegrar o a memória livre. Um destrutor não recebe parâmetros, nunca. O virtual na frente do método indica que ele é abstrato, ou seja, classes que herdam dessa podem criar métodos com o mesmo nome e esse método novo tomará o lugar do antigo. virtual double area() = 0; Quando um método virtual é igualado a zero, a classe que o declarou não irá criar um código para ele. mas as classes que herdam dela precisarão criar. não se pode criar um objeto de uma classe que possua um método virtual = 0, sendo utilizada apenas por herança. caso uma classe possua apenas métodos puramente virtuais ( virtual = 0), a classe comporta-se como uma interface do java, mas como o C++ possui herança multípla, não é muito utilizado. ; as classes terminam com um ponto-e-virgula. favor não esquecer. #endif Já explicado anteriormente. 2.8.2 Herança e Polimorfismo Continuando as explicações linha a linha da seção anterior, analizarei um código com herança e polimorfismo.

2.8. ORIENTACAO A OBJETO 27 class Triangulo : public FiguraGeometrica{ Cria uma nova classe chamada Triangulo estende FiguraGeometrica. tudo que FiguraGeometrica tem, triângulo também tem, afinal, são ambos figuras geométricas. só que uma com certeza é um triângulo, a outra não se sabe. Triangulo(double base, double altura); virtual Triangulo(); Construtor e Destrutor. o construtor do triângulo recebe dois parâmetros, base e altura, que é tudo que um triângulo precisa saber. o destrutor do triângulo é virtual pois pode ser que alguém queira estender essa classe, e para isso é necessário que o destrutor esteja exposto na vtable. vtable é uma tabela de métodos virtuais que podem ser chamados. são mais lentos do quê chamar um método diretamente, mas a diferença de velocidade é tão pequena que no fim das contas, não é levada em conta. ( cacofonia de novo?) private: tudo abaixo disso é considerado privativo da classe double m_base; double m_altura; isso apenas declara duas variáveis de classe chamada de m base e m altura. Porquê não só base e altura como declarei no construtor? é padrão dos programadores de c++ declararem as variáveis de classe com um sufixo m ou. isso ajuda na leitura do código a saber em que se está mexendo. ; termina a classe. não irei explicar o arquivo de circulo pois ele não tem nada de novo. arquivo figurageometrica.cpp #include "figurageometrica.h" FiguraGeometrica::FiguraGeometrica(){ FiguraGeometrica:: FiguraGeometrica(){ arquivo triangulo.cpp

28 CAPÍTULO 2. RELEMBRANDO C++ #include "triangulo.h" Triangulo::Triangulo(double base, double altura) : FiguraGeometrica(){ m_base = base; m_altura = altura; Triangulo:: Triangulo(){ double Triangulo::area(){ return (m_base * m_altura) /2; Por preguiça,e apenas isso, não irei colocar o arquivo do circulo. é bem similar ao triângulo. Explicação linha-a-linha. FiguraGeometrica::FiguraGeometrica(){ FiguraGeometrica:: FiguraGeometrica(){ duas linhas de vez, mas vai. o :: indica de qual classe é o método que estamos criando a declaração. nesse caso, criei apenas um construtor vazio e um destrutor vazio de FiguraGeometrica. porquê não declarei nada de área, se eu tinha declarado ela na classe? área é virtual pura, não pode ser declarada na classe base, e sim declarada nas classes que estendem a mesma. Triangulo::Triangulo(double base, double altura) : FiguraGeometrica(){ m_base = base; m_altura = altura; cria o construtor de triangulo e inicializa as variaveis m base e m altura. o : FiguraGeometrica() invoca o construtor do mesmo, que sabemos ser vazio. caso triângulo fosse na verdade uma espada mágica de RGP e fosse um filho direto de Espada, ItemMagico e ItemAmaldicoado, a construção do construtor com os seus 3 antepassados diretos seria: EspadaMagica::EspadaMagica() : Espada(), ItemMagico()

2.8. ORIENTACAO A OBJETO 29, ItemAmaldicoado(){ cada pai é separado por uma virgula do filho. ( eu não entendo porquê herança múltipla dá nó na cabeça de estudantes de java... ) double Triangulo::area(){ return (m_base * m_altura) /2; Aqui enfim declarando a função area, que teve a assinatura exposta em Figura- Geometrica.h mas não havia sido declarada lá. ao se criar um novo objeto como... FiguraGeometrica *h1 = new Triangulo( 3, 4); h1->area(); a área chamada será a do triângulo. ao se criar um... FiguraGeometrica *h2 = new Circulo(3); h2 -> area(); a área chamada será a do Circulo. e ao se criar um... FiguraGeometrica *h3 = new FiguraGeometrica(); h3 -> area(); o compilador acusará um erro pois no se pode criar objetos que tenham membros puramente virtuais.

30 CAPÍTULO 2. RELEMBRANDO C++

Capítulo 3 Qt Básico 3.1 História do Qt O Qt (pronunciado cute - fofinho por seus criadores) é um framework de desenvolvimento de aplicativos multi-plataforma muito usado para desenvolver programas gráficos ( que no caso é conhecido como um Widget Toolkit ) e também utilizado por desenvolvedores de programas console e servidores. um bom exemplo de aplicativos feitos em Qt são Google Earth, Skype, Adobe Photoshop Album, Opera, e é claro, KDE. Foi criado por Haarvard Nord e Eirik Chambe-Eng em 1991, o nome foi inspirado no Xt, X - toolkit, uma outra biblioteca para criação e interfaces gráficas, mas essa não é muitiplataforma e usa o padrão gráfico Motif, conhecido por ser funcional e feio. o Q foi escolhido por ser uma letra que era bonitinha (juro) no Emacs do cidadão, e o t vem obviamente de toolkit. Figura 3.1: Exemplo de janela criada com Motif. o Qt foi escolhido para o inicio da criação do KDE, um os 2 maiores sistemas de desktop para linux / Unix ( e atualmente na versão 4.2, experimental em Mac e Windows também). mas na epoca ( 1996 ) o qt era licenciado em 2 formas: comercial - para pessoas e empresas que pretendessem ganhar dinheiro com software, e gratuita com código fechado - para pessoas que não se importavam em criar códigos e nada cobrar por eles. 31

32 CAPÍTULO 3. QT BÁSICO Tulip Um conjunto de classes template. Interview Arquitetura Model View. Arthur Scribe Mainwindow Classes de pintura e manipulação e imagem. Renderizador de texto Unicode com uma api publica para manipulações em baixo nivel. Uma janela principal com eventos e layouts pré definidos. Tabela 3.1: Novas tecnologias com o Qt 4 com o aumento do numero de usuarios do kde e a visão de futuro que ele iria ser um dos principais desktops linux pessoas começaram a se organizar, criaram o Free Qt Foundation que tinha vida com o único propósito de manter o Qt aberto caso a trolltech entrasse em colapso ou parassem de criar versões abertas do Qt. Figura 3.2: KDE 1.0 feito em cima do Qt A história foi seguindo seu curso, e em 2000 o Qt mudou o esquema e licenciamento aberto para GLP, que garantiria que seu código fosse aberto, e dava mais liberdades para a modificação de sua engine. o problema foi que o GLP existia apenas para linux. como o Qt era multiplataforma os programadores de mac e windows não foram beneficiados por esse movimento, outras bibliotecas abertas como o GTK estavam sendo portadas para funcionar com o Windows e já funcionavam no mac utilizando o servidor x. o Qt ganhava criticas no lado do linux por ser controlado por uma empresa, pelo lado do windows por não ser aberto, e assim foi até o lançamento do Qt 4 em junho de 2005 que o Qt foi realmente lançado como cóigo aberto para Windows / OSX e Linux no mesmo tempo. E se antes o Qt era apenas uma Biblioteca Toolkit Gráfica (muito poderosa, mas ainda assim monolítica) o Qt 4 trazia mudanças conceituais grandes em sua estrutura. Além disso, também lançaram uma musica e um vídeo comemorativos.

3.2. TECNOLOGIAS NO QT 33 A Trolltech continuou criando versões com diversas melhorias ( mas bem menores do que foi a transição do Qt 3 para o 4) até 2007, quando foi adquirida pela Nokia. a Nokia pegou o Qt em um momento crucial. como era multiplataforma desde o princípio, foi adaptado para dispositivos portáteis e roda em diversos computadores de bolso atuais. Além disso, a versão mais recente do Qt - 4.5 foi relicenciada mais uma vez, de GLP para LGLP. a diferença embora seja só de uma letra é muito grande, pois permite que criem-se aplicativos comerciais que utilizam a biblioteca gratuita do toolkit sem pagar. Isso só foi possível pois a nokia não tem tanta necessidade de ganhar dinheiro com o Qt. Seu capital vem dos dispositivos portáteis, nada mais justo que uma boa ferramenta ( e gratuita ) para desenvolvedores programarem em sua plataforma paga. Figura 3.3: KDE 1.0 feito em cima do Qt O Qt provou ser uma ferramenta estável, robusta e sólida no desktop. provavelmente será a mesma coisa nos pequenos portáteis. 3.2 Tecnologias no Qt Além das tecnologias agregadas ao Qt explicadas na tabela anterior, existem muitas outras coisas que fazem dela um diferencial entre outros toolkits. Todos são escritos por profissionais, você não verá um código Qt com erros básicos como uso de arrays onde se deveriam usar arvores. o Qt é um Monstro Tecnológico, e como todo monstro precisa ser domado antes de sair passeando com ele por ai com uma coleirinha. 3.2.1 WebKit Engine de renderização HTML embutida no Qt. Webkit é uma engine de renderização de HTML. Completa e 100% compativel com o W3C, foi criada a partir de um fork do KHTML para o navegador Safari da apple, mas como parte do contrato GLP do KHTML, o Webkit precisava continuar sendo código aberto, logo várias empresas como o Google, a Nokia e o Gtk Foundation se interessaram pelo crescente desenvolvimento do WebKit, por ser uma

34 CAPÍTULO 3. QT BÁSICO Figura 3.4: Arora, navegador feito em Qt utilizando Webkit biblioteca de integração fácil ( mais facil que o Gecko ) e ter empresas de peso bancando o desenvolvimento. Com o webkit você pode ter um navegador completo com apenas 5 linhas de código no seu programa, com tudo que um navegador de porte precisa. 3.2.2 Phonon Engine de Multimidia embutida no Qt. Figura 3.5: Multimidia fácil o Phonon foi desenvolvido inicialmente pelo KDE que passava por dificuldades com seu sistema original de som, o arts. Precisava-se de um sistema de som Multiplataforma que conseguisse se conectar a parte baixo nível de som sem que o programador se preocupasse com isso. no linux existem várias formas de se tocar um arquivo de video ou musica, usando o xine, gstreamer, alsa direto ( que seria loucura ). Antes do phonon para cada programa no linux era necessário escrever uma parte pra se comunicar com o xine, como você não poderia saber se o usuário teria xine, gstreamer ou alsa, também teria que escrever uma parte para gstreamer, e outra para alsa. imagina o trabalho que isso dava para cada desenvolvedor. Com o phonon ele usa o que estiver dispoível. só tem xine? não tem problema, o phonon detecta e usa. só tem gstreamer? não tem problema, ele faz a mesma coisa. se o xine ou gstreamer modificarem a forma de conexão a única coisa a fazer é atualizar o phonon, e não todos os programas que ligam-se nele. Além disso, funciona também no Windows e OSX. pra quê utilizar uma biblioteca que não é multiplataforma se pode-se utilizar uma que é?