Você está na página 1de 13

24/04/13

Tutorial API Qt

Pesquisa em Computao Grfica


Tutorial API Grfica Qt

UFSM Cincia da Computao Disciplina de Computao Grfica (ELC1015) Pesquisa API Qt com OpenGL

Equipe
Professor Cesar Tadeu Pozzer; Francisco Tiago Avelar; Vitor Conrado Faria Gomes. { p o z z e r , a v e l a r , v c o n r a d o } @ i n f . u f s m . b r

ndice
Tutorial Exemplos Ol Mundo (primeira verso) Ol Mundo (segunda verso) Integrao de Qt com OpenGL Componentes GUI (no escrito ainda)

Tutorial para desenvolvimento de aplicativos integrados com OpenGL utilizando a API grfica Qt
A biblioteca Qt representa um importante framework para desenvolvimento de aplicaes grficas envolvendo recursos aprimorados de interao entre computador e usurio, como emprego de botes, caixas de texto, menus e atalhos do teclado, entre outros. O objetivo relacionar o potencial de Qt voltado integrao com recursos OpengGL nativos. Dessa forma, a construo de programas utilizando noes intuitivas de interfaces grficas integradas com OpenGL passa a ser proposta muito mais simples de abordagem no ponto de vista da disciplina de Computao Grfica (ELC1015). Para obter uma melhor justificativa a respeito da adoo da biblioteca grfica Qt em comparao com as demais implementaes multi-plataforma existentes, recomendvel ler o artigo Estudo Comparativo de Bibliotecas Grficas Integradas com OpenGL. Os exemplos demonstram o uso de componentes de Qt em ordem de aplicabilidade. A medida que o entendimento dos exemplos avanado, maior o emprego de componentes Qt e a demonstrao do potencial no desenvolvimento de programas. Em razo de Qt possuir um ncleo diversificado, a quantidade de espao em memria secundria necessria para portar todas os arquivos de bibliotecas dinmicas grande. Em virtude do enfoque das aplicaes representar animaes grficas em
www.infovisao.com/tutorial_qt/ 1/13

24/04/13

Tutorial API Qt

OpenGL, a meta foi concentrar os pacotes de Qt para este devido fim. Vale a pena mencionar que o framework Qt apresenta uma coleo muito maior de classes e recursos que possibilitam aplicaes integradas com comunicao atravs de diversos protocolos de redes de computadores, interao com sistemas gerenciadores de bancos de dados (SGBDs), manipulao de documentos XML, etc. Para conhecimento das caractersticas completas a respeito de Qt, consulte as referncias no final do documento. Em relao aos exemplos contidos na seqncia, as bibliotecas necessrias foram reduzidas num conjunto de trs principais a partir dos pacotes principais providos por Qt em aquisio ntegra. Vale mencionar que so: libQtCore libQtGui libQtOpenGL Demais arquivos de cabealho se mantiveram inalterados por no representar espao adicional significativo e evitar a problemas de dependncia interna. Um aplicativo adicional especfico de Qt denominado MOC (Meta Object Compiler) necessrio para integrar classes que possuem funes-membro de eventos para interao entre computador e usurio com as respectivas implementaes. A devida ateno ser dedicada no decorrer dos exemplos e a compreenso ser mais simples. Os requisitos para rodar os exemplos de forma bem sucedida encontram-se reunidos em requisitos.tar.bz2. Faa o download e descompacte para uma pasta especfica. Ao descompactar, haver trs pastas que devem ser dispostas dentro de um mesmo nvel de diretrio. As trs pastas esto listadas abaixo: bin include lib Para a associao entre o cdigo-fonte a ser compilado e as bibliotecas de Qt necessrias, possvel fazer uma referncia simblica de caminho segundo a orientao na seqncia. Vale a pena mencionar que a ligao deve ser feita entre cada pasta de forma individual, pois as especificaes das diretivas de compilao de um Makefile dependem diretamente da organizao das pastas para o correto funcionamento. Os comandos devem ser realizados a partir do interior pasta na qual se encontra o cdigofonte do programa.
l ns{ c a m i n h od ap a s t ab i n }b i n l ns{ c a m i n h od ap a s t ai n c l u d e }i n c l u d e l ns{ c a m i n h od ap a s t al i b }l i b

Um exemplo demonstrado para possibilitar uma maior compreenso. Considere que o contedo do pacote requisitos.tar.bz2 foi extrado para a pasta
/ h o m e / u s u a r i o / r e q u i s i t o s . Ento o procedimento passa a ser simples como abaixo: u s u a r i o @ l o c a l h o s t : ~ $p w d / h o m e / u s u a r i o u s u a r i o @ l o c a l h o s t : ~ $c de x e m p l o u s u a r i o @ l o c a l h o s t : ~ / e x e m p l o $l ns/ h o m e / u s u a r i o / r e q u i s i t o s / b i nb i n u s u a r i o @ l o c a l h o s t : ~ / e x e m p l o $l ns/ h o m e / u s u a r i o / r e q u i s i t o s / i n c l u d ei n c l u d e u s u a r i o @ l o c a l h o s t : ~ / e x e m p l o $l ns/ h o m e / u s u a r i o / r e q u i s i t o s / l i bl i b

Supondo que a pasta e x e m p l o exista contendo o cdigo-fonte do programa a partir do caminho padro $ H O M E de usurio, ser necessrio migrar para a devida pasta e realizar as associaes simblicas como demonstradas acima. As trs primeiras linhas simplesmente demonstram a migrao para a pasta contendo o cdigo-fonte e o restante realiza as ligaes. O comando l s l exibe as ligaes entre o nome simblico e o caminho real.

Exemplos
O primeiro exemplo utilizando Qt representa um programa contendo uma pequena
www.infovisao.com/tutorial_qt/ 2/13

24/04/13

Tutorial API Qt

janela com um texto. Atravs disso, ser possvel perceber os componentes mnimos de Qt para compor exemplos simples de entender. Falta escrever mais...

Ol Mundo (primeira verso)


possvel realizar o download do cdigo deste exemplo. Arquivo J a n e l a . h h 1/ / A r q u i v oJ a n e l a . h h 2# i f n d e fJ A N E L A _ D E M O N S T R A C A O _ C G _ 0 1 3# d e f i n eJ A N E L A _ D E M O N S T R A C A O _ C G _ 0 1 4 5# i n c l u d e< Q M a i n W i n d o w > 6# i n c l u d e< Q L a b e l > 7 8c l a s sJ a n e l a:p u b l i cQ M a i n W i n d o w 9{ 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7} ; 1 8 1 9# e n d i f Analisando o Arquivo J a n e l a . h h , consta na linha 5 a incluso de Q M a i n W i n d o w especfica de Qt. Atravs desse componente, possvel construir uma interface grfica para uma aplicao. Considerando o prprio leiaute, pode ser feita a adio de demais componentes como barra de tarefas, barra de menu e barra de status, por exemplo. A partir da janela principal, existe uma rea central que pode ser ocupada por qualquer outro tipo de componente. O leiaute representado esquematicamente abaixo: p r i v a t e : Q L a b e l* r o t u l o ; p u b l i c : J a n e l a ( ) ; ~ J a n e l a ( ) ;

Na linha 6, h a incluso de Q L a b e l , o qual utilizado para exibir texto ou uma imagem. No h forma de interao com o usurio atravs de eventos. A aparncia de um rtulo pode ser ajustada de diversas maneiras e pode conter mnemnicos para demais componentes.
www.infovisao.com/tutorial_qt/ 3/13

24/04/13

Tutorial API Qt

A seguir segue a implementao da classe Janela. Arquivo J a n e l a . c c 1/ / A r q u i v oJ a n e l a . c c 2# i n c l u d e" J a n e l a . h h " 3 4J a n e l a : : J a n e l a ( ) 5{ 6 7 8 9 1 0 1 1} 1 2 1 3J a n e l a : : ~ J a n e l a ( ) 1 4{ 1 5 1 6} No arquivo J a n e l a . c c consta a atribuio de um ttulo para a janela grfica e o seu tamanho em pixels, respectivamente nas linhas 6 e 7. Conforme visualizado no modelo de leiaute de Qt, o rtulo contendo a cadeia de caracteres "Ola Mundo" foi atribudo como componente central na linha 10 aps ter sido instanciado na linha 9. A seguir consta a funo principal "main" correspondendo a chamada padro de inicializao de programa. Arquivo P r i n c i p a l . c c 1/ / A r q u i v oP r i n c i p a l . c c 2# i n c l u d e" J a n e l a . h h " 3# i n c l u d e< Q A p p l i c a t i o n > 4 5i n tm a i n ( i n ta r g c ,c h a r * *a r g v ) 6{ 7 8 9 1 0 1 1 1 2 1 3} A linha 3 do arquivo P r i n c i p a l . c c contm a incluso do componente r e t u r na p l i c a c a o . e x e c ( ) ; J a n e l aj a n e l a ; j a n e l a . s h o w ( ) ; Q A p p l i c a t i o na p l i c a c a o ( a r g c ,a r g v ) ; d e l e t er o t u l o ; r o t u l o=n e wQ L a b e l (Q S t r i n g ( " O l aM u n d o " )) ; s e t C e n t r a l W i d g e t ( r o t u l o ) ; s e t W i n d o w T i t l e (Q S t r i n g ( " A P IQ t " )) ; r e s i z e ( 1 7 2 ,3 2 ) ;

Q A p p l i c a t i o nresponsvel pelo funcionamento inicial para execuo do programa. Possui a funo de gerenciar o controle da interface grfica da aplicao e as configuraes principais. Alm disso, contm o lao principal "main", no qual todos os eventos do sistema de janelas e outras fontes so processadas e encaminhadas para o devido tratamento, assim como gerenciamento da inicializao, finalizao e gerenciamento de seo da aplicao. Abaixo possvel conferir o aspecto grfico do programa exemplificado.

www.infovisao.com/tutorial_qt/

4/13

24/04/13

Tutorial API Qt

Ol Mundo (segunda verso)


possvel realizar o download do cdigo deste exemplo. A partir deste segundo exemplo envolvendo a incorporao de maiores recursos de Qt seguindo a mesma idia do primeiro exemplo, a compreenso do uso de componentes mais elaborados e a vinculao de classes com eventos fica facilitada atravs da avaliao descritiva de cdigo. O arquivo P r i n c i p a l . c c no apresenta modificaes em relao ao primeiro exemplo. A seguir demonstrado o cabealho da nova classe Janela. Arquivo J a n e l a . h h 1/ / A r q u i v oJ a n e l a . h h 2# i f n d e fJ A N E L A _ D E M O N S T R A C A O _ C G _ 0 2 3# d e f i n eJ A N E L A _ D E M O N S T R A C A O _ C G _ 0 2 4 5# i n c l u d e< Q M a i n W i n d o w > 6# i n c l u d e< Q L a b e l > 7# i n c l u d e< Q M e n u B a r > 8# i n c l u d e< Q M e n u > 9# i n c l u d e< Q S t a t u s B a r > 1 0# i n c l u d e< Q A c t i o n > 1 1 1 2c l a s sJ a n e l a:p u b l i cQ M a i n W i n d o w 1 3{ 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9} ; 3 0 3 1# e n d i f Em relao ao primeiro exemplo de Ol Mundo, existe a incluso de mais trs novos componentes compreendendo a linha 7 at a linha 10. Q M e n u B a r representa uma barra de menus posicionada horizontalmente consistindo de uma lista de itens de menu com expanso para baixo. Q M e n u um componente para utilizar em barra de menus, menus de contexto (normalmente acionados pelo boto direito do mouse) e outros menus-pups. Q S t a t u s B a r pode ser instanciado para adicionar uma barra de status horizontal na parte inferior da janela para apresentar informaes de status, alm de facilitar a orientao de uso do programa para o usurio. O indicador de status pode ser de trs tipos: Temporro: ocupa a maior parte da barra de tarefas. Usada para exibir dicas em
www.infovisao.com/tutorial_qt/ 5/13

Q _ O B J E C T / /d e v es e ri n c l u s op o rc a u s ad eQ ts i g n a l s / s l o t s p u b l i c : J a n e l a ( ) ; ~ J a n e l a ( ) ; p r i v a t e : Q L a b e l* r o t u l o ; Q A c t i o n* a c a o S a i r ; Q M e n u* m e n u A r q u i v o ; v o i dc r i a A c a o ( ) ; v o i dc r i a M e n u ( ) ; p r i v a t es l o t s : v o i di m p l e m e n t a A c a o S a i r ( ) ;

24/04/13

Tutorial API Qt

formato texto ou entradas de menu, por exemplo. Normal: ocupa parcialmente a barra de status e pode ser ocultado por mensagens temporrias. Utilizado para exibir um nmero de pgina ou nmero de linha num processador de texto, por exemplo. Permanente: nunca ocultado. Utilizado para indicaes importantes, como notificao da tecla CAPS LOCK acionada ou data/horrio. Q A c t i o n um importante componente de Qt para associar classe com eventos. Oferece uma forma abstrata de interface envolvendo aes inseridas em componentes. Em muitas aplicaes os comandos podem ser invocados atravs de menus, barra de botes e atalhos de teclado. Uma vez que o usurio espera que o comando pode ser tratado de uma mesma maneira, independente de como a interface utilizada, til representar cada comando como uma ao. Em outras palavras, um mesmo evento, como destacar um texto em negrito, pode ser efetuado por mltiplas maneiras, mas a ao correspondente apontada de uma nica forma atravs de Q A c t i o n . Conforme foi mencionado no incio do tutorial, Qt utiliza uma soluo prpria para vincular classes com a implementao de eventos para interao do programa com o usurio. Para tanto, o utilitrio MOC na verdade um gerador de cdigo C++ intermedirio que utiliza componentes de Qt mais especializados para realizar a associao de classes com eventos. Para que o vnculo seja possvel, obrigatoriamente deve existir a incluso da macro Q _ O B J E C T (linha 14 - no h ponto-e-vrgula aps a especificao da macro) para ser interpretada por MOC de modo a gerar o cdigo-fonte correspondente para posteriormente ser compilado normalmente por g++. O prottipo do evento especificado no cabealho apresentado numa regio particular do cdigo incluindo a palavra-chave do mecanismo de visibilidade do paradigma de orientao a objeto. Isso pode ser visto explicitamente nas linhas 27 e 28. S l o t s so regies mapeadas que sero utilizadas por MOC para fazer a associao do correta de eventos com os S i g n a l s(disparos) causados pela interao com a interface grfica pelo usurio. O conceito de S i g n a l s /S l o t s fica mais simples de compreender analisando a implementao da classe Janela a seguir. Arquivo J a n e l a . c c 1/ / A r q u i v oJ a n e l a . c c 2# i n c l u d e" J a n e l a . h h " 3 4J a n e l a : : J a n e l a ( ) 5{ 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7} 1 8 1 9J a n e l a : : ~ J a n e l a ( ) 2 0{ 2 1 2 2 2 3 2 4}
www.infovisao.com/tutorial_qt/ 6/13

s e t W i n d o w T i t l e (t r ( " A P IQ t " )) ; r e s i z e ( 2 3 0 ,1 0 0 ) ; t h i s > c r i a A c a o ( ) ; t h i s > c r i a M e n u ( ) ; r o t u l o=n e wQ L a b e l ( " O l aM u n d o " ) ; s e t C e n t r a l W i d g e t ( r o t u l o ) ; s t a t u s B a r ( ) > s h o w M e s s a g e (t r ( " B e m v i n d oaA P IQ t . " )) ; s t a t u s B a r ( ) > s e t S i z e G r i p E n a b l e d ( f a l s e ) ;

d e l e t er o t u l o ; d e l e t ea c a o S a i r ; d e l e t em e n u A r q u i v o ;

24/04/13

Tutorial API Qt

2 5 2 6v o i dJ a n e l a : : c r i a A c a o ( ) 2 7{ 2 8 2 9 3 0 3 1 3 2} 3 3 3 4v o i dJ a n e l a : : c r i a M e n u ( ) 3 5{ 3 6 3 7 3 8} 3 9 4 0v o i dJ a n e l a : : i m p l e m e n t a A c a o S a i r ( ) 4 1{ 4 2 4 3} O construtor da classe Janela realiza a atribuio do ttulo da janela grfica (linha 6) e o tamanho da janela, em pixels (linha 7). O diferencial estabelecido ocorre nas linhas 9 e 10. A chamada da funo-membro c r i a A c a o aponta para a execuo do cdigo especificado a partir da linha 28 at a linha 31. Aps instanciar uma Q A c t i o n incluindo a cadeia na caracteres "Sair" como parmetro (o smbolo '&' indica o corresponde acesso atravs do teclado) na linha 28, uma tecla de atalho foi atribuda na linha 29 e a dica a ser exibida na barra de status definida na linha 30. A ateno especial deve ser feita na linha 31. A chamada de c o n n e c t , especificada em QObject na API Qt, possui a funo de realizar a associao entre a Q A c t i o n instanciada em a c a o S a i r com o mtodo i m p l e m e n t a A c a o S a i r ( ) . Observe que o sinal que gera o disparo do mtodo definido por t r i g g e r e d ( ) . Isso significa que o critrio para invocar o evento quando o gatilho (trigger ) for acionado pelo usurio, seja atravs do mouse ou teclas de atalho do teclado. Em outras palavras, o ponteiro a c a o S a i r gera um S I G N A L , quando tiver o gatilho acionado, para a prpria classe t h i s envolvendo o S L O Tcontendo o evento i m p l e m e n t a A c a o S a i r ( ) . por essa razo que em J a n e l a . h h , na linha 27, existe a palavra s i g n a l s , pois assim possvel para MOC fazer associao correta entre eventos e as respectivas implementaes. Um outro exemplo pode ser dado como c o n n e c t ( r a d i o , S I G N A L ( t o g g l e d ( b o o l ) ) , t h i s , S L O T ( e v e n t o R a d i o ( b o o l ) ) ) . A interpretao semelhante. Um boto radio utilizado em formulrios para definir uma escolha nica entre um grupo de possibilidades, possui o sinal disparado quando for alterado (t o g g l e d ( b o o l ) ), incluindo como parmetro um valor lgico representando selecionado (true) ou no-selecionado (false), para tratamento na prpria classe t h i s no S L O T contendo a chamada da funo-membro representando o evento e v e n t o R a d i o ( b o o l ) . Existem diversas possibilidades de gerao de sinais associados a componentes para chamada de eventos, mas o mtodo utilizando c o n n e c t possui comportamento como foi apresentado. No esquecendo a linha 10 do arquivo J a n e l a . c c , existe a chamada da funo membro c r i a M e n u ( ) . A execuo do cdigo nas linhas 36 e 37 simplesmente cria um item de menu "Arquivo" e vincula a c a o S a i r ao objeto menuArquivo para interao com o usurio, respectivamente. As linhas 40 at a linha 43 contm a implementao de i m p l e m e n t a S a i r que
www.infovisao.com/tutorial_qt/ 7/13

a c a o S a i r=n e wQ A c t i o n (Q S t r i n g ( " & S a i r " ) ,t h i s) ; a c a o S a i r > s e t S h o r t c u t (Q S t r i n g ( " C T R L + S " )) ; a c a o S a i r > s e t S t a t u s T i p (Q S t r i n g ( " E n c e r r aoa p l i c a t i v o . " )) ; c o n n e c t (a c a o S a i r ,S I G N A L ( t r i g g e r e d ( ) ) ,t h i s ,S L O T ( i m p l e m e n t a A c a o S a i r ( ) )) ;

m e n u A r q u i v o=m e n u B a r ( ) > a d d M e n u (Q S t r i n g ( " & A r q u i v o " )) ; m e n u A r q u i v o > a d d A c t i o n ( a c a o S a i r ) ;

c l o s e ( ) ;

24/04/13

Tutorial API Qt

corresponde ao fechamento da janela do aplicativo. A captura de tela a seguir demonstra o aspecto grfico do segundo exemplo de Ol Mundo.

Integrao de Qt com OpenGL


possvel realizar o download do cdigo deste exemplo. Uma vez compreendido os componentes bsicos de Qt incluindo a associao de objetos com eventos de usurio atravs da funo-membro c o n n e c t da classe Q O b j e c t especfica de Qt, uma viso mais especializada que vem a compor o tema principal deste tutorial passa a ser abordada de um modo mais descritivo. A essncia ser mantida na classe Cena que detm a manipulao nativa de componentes Opengl. Ao fazer o download do cdigo de forma ntegra, ser possvel verificar demais classes auxiliares que regem o exemplo de forma completa. A integrao de Qt com OpenGL ilustrada atravs de um exemplo simples que envolve a criao de uma interface grfica elaborada para interao entre a primitiva G L _ T R I A N G L E S de OpenGL e o usurio. Considerando o leiaute de Qt demonstrado inicialmente no tutorial, o componente central ser uma animao grfica regido por eventos disparados pela barra de botes, alm de uma barra de status para exibir uma descrio dos eventos. A seguir h uma captura de tela para que se tenha uma idia global do exemplo.

www.infovisao.com/tutorial_qt/

8/13

24/04/13

Tutorial API Qt

A definio do cabealho da classe Cena est definida abaixo. Perceba a incluso das bibliotecas especficas de OpenGL na linha 7 at a linha 9 e a declarao da macro Q _ O B J E C Tna linha 21. Arquivo C e n a . h h 1/ / A r q u i v oC e n a . h h 2# i f n d e fC E N A _ D E M O N S T R A C A O _ A P I 3# d e f i n eC E N A _ D E M O N S T R A C A O _ A P I 4 5# i n c l u d e< Q G L W i d g e t > 6# i n c l u d e< Q T i m e r > 7# i n c l u d e< G L / g l u t . h > 8# i n c l u d e< G L / g l u . h > 9# i n c l u d e< G L / g l . h > 1 0# i n c l u d e< i o s t r e a m > 1 1# i n c l u d e< s t d l i b . h > 1 2 1 3# d e f i n eL I M _ S U P _ A C E L E R A C A O3 0 0 1 4# d e f i n eL I M _ I N F _ A C E L E R A C A O1 1 5# d e f i n eI N C _ A C E L E R A C A O5 1 6 1 7u s i n gn a m e s p a c es t d ; 1 8 1 9c l a s sC e n a:p u b l i cQ G L W i d g e t 2 0{ 2 1 2 2 2 3 2 4 2 5
www.infovisao.com/tutorial_qt/

Q _ O B J E C T/ /d e v es e ri n c l u s op o rc a u s ad eQ ts i g n a l s / s l o t s p u b l i c : C e n a ( Q W i d g e t*a n c e s t r a l ) ; v o i ds e t S e n t i d o R o t a c a o ( b o o ls e n t i d o ) ;
9/13

24/04/13

Tutorial API Qt

2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 6} ; 4 7

v o i dd e s a c e l e r a r ( ) ; v o i da c e l e r a r ( ) ; v o i dp a r a r ( ) ; v o i di n i c i a r ( ) ; p r o t e c t e d : v o i di n i t i a l i z e G L ( ) ; v o i dr e s i z e G L ( i n tl a r g u r a ,i n ta l t u r a ) ; v o i dp a i n t G L ( ) ; v o i du p d a t e G L ( ) ; p r i v a t e : i n tv a l o r _ r o t a c a o ; i n tf a t o r _ a c e l e r a c a o ; i n tv a l o r _ t r a n s l a c a o ; b o o ls e n t i d o _ r o t a c a o ; Q T i m e r* t e m p o r i z a d o r ;

4 8# e n d i f Tendo visto o arquivo C e n a . h h , no apresenta modificaes de acordo com o que foi apresentado nos exemplos anteriores, exceto pela obrigatoriedade em incluir as bibliotecas de OpenGL. A partir disso, agora uma anlise mais apurada pode ser realizada referente a implementao da classe Cena. Considere o cdigo abaixo: Arquivo C e n a . c c 1/ / A r q u i v oC e n a . c c 2# i n c l u d e" C e n a . h h " 3 4C e n a : : C e n a ( Q W i d g e t* a n c e s t r a l ):Q G L W i d g e t ( a n c e s t r a l ) 5{ 6 7 8 9 1 0 1 1} 1 2 1 3v o i dC e n a : : i n i t i a l i z e G L ( ) 1 4{ 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2} 2 3 2 4v o i dC e n a : : r e s i z e G L ( i n tl a r g u r a ,i n ta l t u r a ) 2 5{ 2 6 2 7} 2 8 2 9v o i dC e n a : : p a i n t G L ( ) 3 0{
www.infovisao.com/tutorial_qt/ 10/13

t e m p o r i z a d o r=n e wQ T i m e r ( t h i s ) ; t h i s > v a l o r _ r o t a c a o=0 ; t h i s > v a l o r _ t r a n s l a c a o=0 ; t h i s > s e n t i d o _ r o t a c a o=t r u e ;/ /v e r d a d e i r op a r as e n t i d oh o r a r i o t h i s > f a t o r _ a c e l e r a c a o=3 0 ;

g l C l e a r C o l o r ( 0 . 0 ,0 . 0 ,0 . 0 ,0 . 0 ) ; g l S h a d e M o d e l ( G L _ S M O O T H ) ; g l M a t r i x M o d e ( G L _ P R O J E C T I O N ) ; g l L o a d I d e n t i t y ( ) ; g l u P e r s p e c t i v e ( 4 5 ,1 ,0 . 5 ,1 0 0 0 ) ; c o n n e c t ( t e m p o r i z a d o r ,S I G N A L ( t i m e o u t ( ) ) ,t h i s ,S L O T ( u p d a t e G L ( ) ) ) ;

/ /

24/04/13

Tutorial API Qt

3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7} 4 8

g l C l e a r ( G L _ C O L O R _ B U F F E R _ B I T|G L _ D E P T H _ B U F F E R _ B I T) ; g l L o a d I d e n t i t y ( ) ; g l R o t a t e f ( t h i s > v a l o r _ r o t a c a o ,0 . 0 ,0 . 0 ,1 . 0 ) ; g l T r a n s l a t e d ( 0 . 2 ,0 . 2 ,1 . 0 ) ; g l B e g i n ( G L _ T R I A N G L E S ) ; g l C o l o r 3 f ( 0 . 2 ,0 . 3 ,0 . 8 ) ; g l V e r t e x 3 f ( 0 . 0 ,0 . 0 ,0 . 0 ) ; g l C o l o r 3 f ( 0 . 1 ,0 . 9 ,0 . 7 ) ; g l V e r t e x 3 f ( 0 . 4 ,0 . 0 ,0 . 0 ) ; g l C o l o r 3 f ( 0 . 5 ,0 . 4 ,0 . 3 ) ; g l V e r t e x 3 f ( 0 . 2 ,0 . 4 ,0 . 0 ) ; g l E n d ( ) ;

4 9v o i dC e n a : : u p d a t e G L ( ) 5 0{ 5 1 5 2 5 3 5 4 5 5 5 6 5 7 5 8 5 9 6 0 6 1 6 2 6 3 6 4} 6 5 6 6v o i dC e n a : : s e t S e n t i d o R o t a c a o ( b o o ls e n t i d o ) 6 7{ 6 8 6 9 7 0 7 1 7 2 7 3 7 4 7 5} 7 6 7 7v o i dC e n a : : a c e l e r a r ( ) 7 8{ 7 9 8 0 8 1 8 2 8 3 8 4 8 5 8 6 8 7
www.infovisao.com/tutorial_qt/

i f ( t h i s > s e n t i d o _ r o t a c a o= =t r u e ) { t h i s > v a l o r _ r o t a c a o=1 ; }e l s e { t h i s > v a l o r _ r o t a c a o+ =1 ; } i f (a b s ( t h i s > v a l o r _ r o t a c a o )>3 6 0) { t h i s > v a l o r _ r o t a c a o=0 ; } g l D r a w ( ) ;

i f ( s e n t i d o= =t r u e )/ /s e n t i d oh o r a r i o { t h i s > s e n t i d o _ r o t a c a o=t r u e ; }e l s e/ /s e n t i d oa n t i h o r a r i o { t h i s > s e n t i d o _ r o t a c a o=f a l s e ; }

t h i s > f a t o r _ a c e l e r a c a o=I N C _ A C E L E R A C A O ; / /t e s t as eof a t o rd ea c e l e r a c a on a op a s s o ud ol i m i t ei n f e r i o r i f ( t h i s > f a t o r _ a c e l e r a c a o<L I M _ I N F _ A C E L E R A C A O ) { t h i s > f a t o r _ a c e l e r a c a o=L I M _ I N F _ A C E L E R A C A O ; } t e m p o r i z a d o r > s t o p ( ) ;


11/13

24/04/13

Tutorial API Qt

8 8 8 9} 9 0

t e m p o r i z a d o r > s t a r t ( f a t o r _ a c e l e r a c a o ) ;

9 1v o i dC e n a : : d e s a c e l e r a r ( ) 9 2{ 9 3 9 4 9 5 9 6 9 7 9 8 9 9 1 0 0 1 0 1 1 0 2 1 0 3} 1 0 4 1 0 5v o i dC e n a : : p a r a r ( ) 1 0 6{ 1 0 7 1 0 8} 1 0 9 1 1 0v o i dC e n a : : i n i c i a r ( ) 1 1 1{ 1 1 2 1 1 3} Analisando a implementao da classe Cena, o construtor apresenta como t e m p o r i z a d o r > s t a r t ( f a t o r _ a c e l e r a c a o ) ; t e m p o r i z a d o r > s t o p ( ) ; t e m p o r i z a d o r > s t o p ( ) ; t e m p o r i z a d o r > s t a r t ( f a t o r _ a c e l e r a c a o ) ; } / /t e s t as eof a t o rd ea c e l e r a c a on a op a s s o ud ol i m i t es u p e r i o r i f ( t h i s > f a t o r _ a c e l e r a c a o>L I M _ S U P _ A C E L E R A C A O ) { t h i s > f a t o r _ a c e l e r a c a o=L I M _ S U P _ A C E L E R A C A O ; t h i s > f a t o r _ a c e l e r a c a o+ =I N C _ A C E L E R A C A O ;

parmetro um ponteiro para Q W i d g e t (linha 4) que representa uma classe mais genrica de componente em Qt. A varivel a n c e s t r a l serve para associar Cena com a classe a qual pertence, ou seja, a janela principal do programa (vide P r i n c i p a l . c c exemplo completo ao efetuar o download), sendo onde instanciada e posicionada como componente central. Existem quatro funes-membro virtuais implementadas na classe Cena que especializa Q G L W i d g e t , as quais so: i n i t i a l i z e G L ( ) : responsvel pela inicializao de uma animao em OpenGL, tal como a cor de fundo, cmera, matriz de projeo, etc. r e s i z e G L ( ) : tratamento da janela de exibio na animao quando exister redimensionamento de tela. Usado para definir os novos limites para plotagem da animao. p a i n t G L ( ) : funo chamada para atualizar uma animao em OpenGL. o local de disposio das coordenadas de objeto, podendo ser seguido de transformaes, como rotao e translao. O mtodo u p d a t e G L ( ) (linha49) altera a varivel de classe v a l o r _ r o t a c a o que define o sentido da rotao do tringulo. Na linha 63 ocorre a chamada de g l D r a w ( ) que por sua vez invoca o mtodo p a i n t G L ( ) especificado nas linhas 29 at a linha 47, cuja funo redesenhar a animao com o novo valor de rotao (linha 35), assim como demais especificaes de OpenGL que permanecem inalteradas. No caso de r e s i z e G L ( i n t , i n t ) (linha 24), no h foi especificado um modo para redefinir a animao no caso da janela ter o tamanho modificado por questes de simplicao de cdigo. Por questes de desempenho, a atualizao de uma rea grfica contendo uma animao em OpenGL somente feita quando for sobreposta por algum componente grfico adicional de janela, como um menu suspenso, item de menu expandido ou
www.infovisao.com/tutorial_qt/ 12/13

24/04/13

Tutorial API Qt

minimizao/maximizao de janela. Desse modo, caso no ocorrer qualquer modificao sobre Q G L W i d g e t definido, no caso do exemplo, como item central, a renderizao do componente no ser feita. Em conseqncia disso, o efeito de rotao do tringulo sobre o mesmo eixo no ser produzido, independente do fator de acelerao sofrer modificao (mtodos nas linhas 77 e 91) e inverso de sentido na rotao (linha 66). Para que o efeito da animao seja produzido, a atualizao automtica de tela do componente OpenGL precisa ser feita de forma automatizada. Para isso, foi utilizado o componente Q T i m e rque representa um temporizador existente na API Qt. Dado um certo tempo sendo atingido, ocorre um disparo de sinal t i m e o u t ( ) , isso pode ser verificado na linha 21, sendo tambm escrito abaixo: c o n n e c t (t e m p o r i z a d o r ,S I G N A L ( t i m e o u t ( ) ) ,t h i s ,S L O T ( u p d a t e G L ( ) )) ; Retomando o modo de Qt para vincular classes com eventos, a instncia de Q T i m e r declarada como t e m p o r i z a d o r (linha 42 em C e n a . h h ) gera um sinal de tempo excedido, acionando, na prpria classe Cena, para o SLOT contendo o mtodo u p d a t e G L ( ) responsvel para verificar o sentido da rotao e invocar g l D r a w ( ) (linha 63) para atualizar a tela de forma automtica. Repare que u p d a t e G L ( ) , prototipado na linha 35 do arquivo C e n a . h h , no foi definido dentro de um S L O T especfico de cdigo. Isso de justifica em razo de u p d a t e G L ( )j representar um S L O Tpblico na API Qt.

Documento criado em 13 de novembro de 2007, s 20:47

www.infovisao.com/tutorial_qt/

13/13