<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog do Blabos de Blebe &#187; Qt</title>
	<atom:link href="http://blog.blabos.org/category/tecnologia/programacao/qt/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.blabos.org</link>
	<description>Qt, Perl, tecnologia e algum blá blá blá</description>
	<lastBuildDate>Sat, 31 Jul 2010 21:21:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Nokia lança Qt 4.5 e Qt Creator 1.0 &#8211; Qt Extended vai pro saco</title>
		<link>http://blog.blabos.org/2009/03/nokia-lanca-qt-45-e-qt-creator-10-qt-extended-vai-pro-saco/</link>
		<comments>http://blog.blabos.org/2009/03/nokia-lanca-qt-45-e-qt-creator-10-qt-extended-vai-pro-saco/#comments</comments>
		<pubDate>Sat, 07 Mar 2009 01:37:59 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=435</guid>
		<description><![CDATA[A notícia é velha, mas ainda está quentinha. Na última terça-feira dia 03 de março, a Nokia anunciou o lançamento da tão aguardada versão 4.5 do Qt, deu um fim no Qt Extended e ainda liberou o primeiro release do Qt Creator. A primeira novidade foi o empacotamento de todas as bibliotecas e ferramentas num [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">A notícia é velha, mas ainda está quentinha. Na última terça-feira dia 03 de março, a Nokia anunciou o lançamento da tão aguardada versão 4.5 do Qt, deu um fim no Qt Extended e ainda liberou o primeiro release do Qt Creator.</p>
<p><span id="more-435"></span></p>
<p style="text-align: justify;">A primeira novidade foi o empacotamento de todas as bibliotecas e ferramentas num único pacote, provendo um instalador gráfico. Esse &#8220;pacote&#8221; recebeu o nome de <a href="http://www.qtsoftware.com/products/whats-new-in-qt/whats-new-in-qt#complete-qt-sdk-in">Qt SDK</a>. Assim que quiser uma instalação padrão sem muita dor de cabeça só precisa baixar um único binário, executá-lo e next, next, finish.</p>
<p style="text-align: justify;">A partir desta versão o Qt também estará disponível sob a licença <a href="http://www.gnu.org/licenses/lgpl-2.1.html">LGPL versão 2.1</a>, permitindo que os desenvolvedores utilizem o framework em aplicações comerciais, sem custos de licenciamento. Então, aquelas empresas que utiliza(\w*)m o Qt GPL clandestinamente em suas aplicações comerciais, já podem aposentar o papagaio e o rum de vez! Ma-ra-vi-lha!</p>
<p style="text-align: justify;">Dentre as novidades podemos citar ainda uma melhora na interação com o <a href="http://www.qtsoftware.com/products/whats-new-in-qt/whats-new-in-qt#upgrade-to-latest-webkit">WebKit</a>, incluindo suporte à API de plugins, o que torna aplicações em Qt capazes de executar Flash. Também foram adicionados alguns efeitos avançados como animação e zoom, bem como uma nova engine de JavaScript bem mais rápida.</p>
<p style="text-align: justify;">A primeira release do Qt Creator mostra que o pessoal lá <a href="http://labs.trolltech.com/blogs/2009/03/03/qt-creator-10-is-out/">não andou dormindo muito ultimamente</a>, pois a IDE tem evoluído bastante e já tem alguns recursos bem interessantes. Por outro lado ainda não está 100%, apresentando alguns crashes (no meu sistema). Apesar disso, eu pretendo testar num projeto lá no trabalho.</p>
<p style="text-align: justify;">Outro melhoria gritante desta versão está na performance. Andaram mexendo bastante no sistema gráfico, paint engine, etc. Parece besteira mas eu percebi uma diferença brutal na renderização dos objetos, visível a olho nu. Fiquei impressionado! Essa veloacidade também pode ser notada no Qt Creator.</p>
<p style="text-align: justify;">Outras features interessantes foram melhoradas/adicionadas. Para conferir, siga link direto do <a href="http://www.qtsoftware.com/products/whats-new-in-qt/whats-new-in-qt">site da Qt Software</a>.</p>
<p style="text-align: justify;">Outro ponto interessante é que a Nokia colocou uma pá de cal no Qt Extended, anunciando a sua descontinuidade. A última versão, 4.4.3 ainda será suportada por mais uma ano, no entanto as features mais importantes serão migradas para o próprio Qt, concentrando esforços em apenas um produto, conforme pode ser conferido no <a href="http://www.qtsoftware.com/about/news/qt-software-discontinues-qt-extended">anúncio oficial</a>.</p>
<p style="text-align: justify;">Se você prefere compilar o código-fonte você mesmo, pode baixá-lo diretamente do ftp da Qt Software em: <a href="ftp://ftp.qtsoftware.com/qt/source/">ftp://ftp.qtsoftware.com/qt/source/</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2009/03/nokia-lanca-qt-45-e-qt-creator-10-qt-extended-vai-pro-saco/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Instalando e integrando Eclipse, CDT, Qt, Subversion, Perl, Vim e Web Tools somente com o mouse</title>
		<link>http://blog.blabos.org/2009/02/instalando-e-integrando-eclipse-cdt-qt-subversion-perl-vim-e-web-tools-somente-com-o-mouse/</link>
		<comments>http://blog.blabos.org/2009/02/instalando-e-integrando-eclipse-cdt-qt-subversion-perl-vim-e-web-tools-somente-com-o-mouse/#comments</comments>
		<pubDate>Sat, 21 Feb 2009 03:00:05 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Eee]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[VIM]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=391</guid>
		<description><![CDATA[Há muito tempo atrás em um post nem tão longe daqui, nós mostramos como instalar o eclipse com plugins para desenvolvimento em Qt e integrando com o Subversion. Mas o tempo passa, as versões mudam e tudo fica diferente, e desta vez vamos mostrar como fazer isso apenas com cliques e num Eee Pc. É [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Há muito tempo atrás em um <a href="http://blog.blabos.org/2008/05/eclipseqtsvn/">post</a> nem tão longe daqui, nós mostramos como instalar o eclipse com plugins para desenvolvimento em Qt e integrando com o Subversion. Mas o tempo passa, as versões mudam e tudo fica diferente, e desta vez vamos mostrar como fazer isso apenas com cliques e num Eee Pc.</p>
<p><span id="more-391"></span></p>
<p style="text-align: justify;">É claro que não é o tipo de coisa que deve ser usada para torturar um netbook, pois ele não foi desenhado para ser uma estação de desenvolvimento. Tanto é que ao final da instalação acabou o espaço disponível em disco, que já não era muito. Em termos de desempenho também não fica lá essas coisas, afinal é um NETbook, não un NOTEbook.</p>
<h2>Passo #0: Instalação do Java</h2>
<p style="text-align: justify;">Desta vesta vez ao invés de instalar a JRE na mão, utilizamos o synaptic, onde é só mandar procurar, clicar e instalar. Eu me contento com as versões disponíveis do java. Para maiores detalhes, seguem os links habituais: <a href="http://java.sun.com/javase/downloads/index.jsp">Download do Java</a> e <a href="http://java.sun.com/javase/6/webnotes/install/index.html">Dicas de Instalação</a>.</p>
<p style="text-align: center;"><a href="http://img.blabos.org/blog/posts/2009/02/eclipse/synaptic-java.png"><img border="1" src="http://img.blabos.org/blog/posts/2009/02/eclipse/thumb_synaptic-java.png" /></a></p>
<h2>Passo #1: Instalação do Eclipse</h2>
<p style="text-align: justify;">Eu vou continuar baixando e instalando o eclipse diretamente do seu <a href="http://www.eclipse.org/downloads">site</a>, pois a versão disponibilizada via synaptic é velha demais para mim <img src='http://blog.blabos.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Eu preferi o eclipse SDK, aquele que vem com o Java ao invés do CDT. Mas você pode escolher qualquer um.</p>
<p style="text-align: center;"><a href="http://img.blabos.org/blog/posts/2009/02/eclipse/eclipse.org.png"><img border="1" src="http://img.blabos.org/blog/posts/2009/02/eclipse/thumb_eclipse.org.png" /></a></p>
<p style="text-align: justify;">Feito o download, um duplo clique no arquivo abre o descompactador. Daí é só mandar extrair em algum diretório à sua escolha. Eu preferi deixar no ~/local, já que ficando no meu home, não vou precisar de permissão de administrador para instalar.</p>
<p style="text-align: center;"><a href="http://img.blabos.org/blog/posts/2009/02/eclipse/03-install.png"><img border="1" src="http://img.blabos.org/blog/posts/2009/02/eclipse/thumb_03-install.png" /></a></p>
<p style="text-align: justify;">Eu também precisei <a href="http://gnome-look.org/content/show.php/Eclipse+IDE+icon?content=20398">baixar o ícone</a>, pois ou no pacote não tem, ou está escondido demais para mim.</p>
<p style="text-align: center;"><a href="http://img.blabos.org/blog/posts/2009/02/eclipse/05-install.png"><img border="1" src="http://img.blabos.org/blog/posts/2009/02/eclipse/thumb_05-install.png" /></a></p>
<h2>Passo #2: Instalando o CDT</h2>
<p style="text-align: justify;">Para isso bastar abrir o eclipse e ir em Help&gt;Softwares Updates procurar po cdt e mandar ver na instalação. Ao terminar, o eclipse pede para ser reiniciado. Como pessoa bondosa que sou eu respondo sim cada vez que ele me pergunta.</p>
<p style="text-align: center;"><a href="http://img.blabos.org/blog/posts/2009/02/eclipse/06-cdt.png"><img border="1" src="http://img.blabos.org/blog/posts/2009/02/eclipse/thumb_06-cdt.png" /></a></p>
<h2>Passo #3: Integração com o Subversion</h2>
<p style="text-align: justify;">Esse é um pouco menos fácil. Vá em Help&gt;Softwares Updates e procure por, advinhe? mylyn. Pra começar a brincadeira isso vai ser necessário para a instalação da integração com Subversion. Daí o de sempre, next, nex, install. Depois, Help&gt;Softwares Updates procure por svn e mais uma vez, next, next, install. O problema é que isso vai instalar somente a integração (???), ainda faltam os conectores (???), ou seja, integra, mas não integra tanto assim&#8230;</p>
<p style="text-align: center;"><a href="http://img.blabos.org/blog/posts/2009/02/eclipse/08-mylyn.png"><img border="1" src="http://img.blabos.org/blog/posts/2009/02/eclipse/thumb_08-mylyn.png" /></a></p>
<p style="text-align: center;"><a href="http://img.blabos.org/blog/posts/2009/02/eclipse/07-subversive.png"><img border="1" src="http://img.blabos.org/blog/posts/2009/02/eclipse/thumb_07-subversive.png" /></a></p>
<p style="text-align: justify;">A instalação dos conectores é feita via um <a href="http://www.polarion.org/index.php?page=installation&#038;project=subversive#install">site próprio</a>. Mas cuidado agora, a menos que você esteja no windows, evite os pacores win32, óbvio. Isso vai te poupar muitas dores de cabeça, pois o eclipse é meio tímido quando o assunto é sobre os erros. Feito isso, next, next, install, e reiniciar o eclipse denovo&#8230;</p>
<p style="text-align: center;"><a href="http://img.blabos.org/blog/posts/2009/02/eclipse/10-connector.png"><img border="1" src="http://img.blabos.org/blog/posts/2009/02/eclipse/thumb_10-connector.png" /></a></p>
<h2>Passo #4: Integração com Perl</h2>
<p style="text-align: justify;">A integração com Perl é bem simples de ser instalada, bastando adicionar o <a href="http://www.epic-ide.org">site do EPIC</a> e mandar ver no next, next, install&#8230;</p>
<p style="text-align: center;"><a href="http://img.blabos.org/blog/posts/2009/02/eclipse/13-epic.png"><img border="1" src="http://img.blabos.org/blog/posts/2009/02/eclipse/thumb_13-epic.png" /></a></p>
<h2>Passo #5: Qt Eclipse Integration</h2>
<p style="text-align: justify;">Pra variar, nada de next, next, intall. Desta vez, é baixar do site da <del>TrollTech</del> <a href="http://www.qtsoftware.com/developer/eclipse-integration">Qt Software</a>, duplo clique e mandar descompactar no mesmo diretório que o eclipse foi descompactado, no meu caso ~/local. Nâo é dentro do diretório do eclipse, é fora, no mesmo nível, pois o arquivo da integração com o Qt vai criar um diretório eclipse/ onde for descompactado e esse diretório precisa combinar com o diretório do eclipse.</p>
<p style="text-align: center;"><a href="http://img.blabos.org/blog/posts/2009/02/eclipse/14-qt-eclipse-integration.png"><img border="1" src="http://img.blabos.org/blog/posts/2009/02/eclipse/thumb_14-qt-eclipse-integration.png" /></a></p>
<h2>Passo #6: Web Tools</h2>
<p style="text-align: justify;">Ultimamente eu ando me arriscando denovo no mundo do desenvolvimento web com o Catalyst. Por isso algumas ferramentas como um editor de html ajudam muito. Eu usava o kate, mas agora descobri os plugins do próprio eclipse. Então, mãos à obra, pra variar, Help&gt;Softwares Updates, procurar por web e então next, next, install.</p>
<p style="text-align: center;"><a href="http://img.blabos.org/blog/posts/2009/02/eclipse/17-web.png"><img border="1" src="http://img.blabos.org/blog/posts/2009/02/eclipse/thumb_17-web.png" /></a></p>
<h2>Passo #7: Vim Plugin</h2>
<p style="text-align: justify;">Por último e não menos importante não dá pra deixar o Eclipse completo, sem integrá-lo com o mais importante IDE de todos os tempos, <strong>o VIM</strong>.</p>
<p style="text-align: justify;">Por ser o Vim uma ferramenta de &#8220;modo texto&#8221;, a instalação do <a href="http://vimplugin.org/installation">Vim Plugin</a> não tem screen shots <img src='http://blog.blabos.org/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  . Mas não se preocupem, basta acessar o site dele e seguir as poucas intruções. Não se esqueçam de marcar no eclipse a opção &#8216;Embed Vim&#8217; pois senão ao abrir os arquivos ele vai abrir uma janela nova.</p>
<h2>Considerações Finais</h2>
<p style="text-align: justify;">A nova versão do Eclipse, Ganymede, está bem mais produtiva e fácil de instalar. Já é até possível instalar a maioria dos plugins sem muita dor de cabeça. A integração com o Qt e Subversion, por exemplo, são duas mãos na roda principalmente para os desenvolvedores independentes. As ferramentas de edição de HTML, apesar de deixarem um pouco a desejar, também estão muito boas.</p>
<p style="text-align: justify;">Para o meu workspace ser perfeito só faltava o Eclipse ser bonito como o <a href="http://labs.trolltech.com/blogs/category/qtcreator/">QtCreator</a>, o EPIC funcionar como a parte do <a href="http://padre.perlide.org/">Padre</a> que funciona e o plugin do VIM ser um pouco mais decente, mas afinal não dá pra copiar o VIM, né&#8230;</p>
<h2>Links Interessantes</h2>
<p style="text-align: justify;">
<ul>
<li><a href="http://www.eclipse.org">Eclipse.org</a></li>
<li><a href="http://www.qtsoftware.com/">Qt Software</a></li>
<li><a href="http://labs.trolltech.com/blogs/category/qtcreator/">QtCreator</a></li>
<li><a href="http://www.polarion.org/index.php?page=overview&#038;project=subversive">Polarion Community</a></li>
<li><a href="http://svnbook.red-bean.com/">SVN Redbook</a></li>
<li><a href="http://www.epic-ide.org/">EPIC &#8211; Eclipse Perl Integration</a></li>
<li><a href="http://padre.perlide.org/">Padre &#8211; Perl IDE</a></li>
<li><a href="http://vimplugin.org/">VIM Plugin</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2009/02/instalando-e-integrando-eclipse-cdt-qt-subversion-perl-vim-e-web-tools-somente-com-o-mouse/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Eclipse + Qt + svn</title>
		<link>http://blog.blabos.org/2008/05/eclipseqtsvn/</link>
		<comments>http://blog.blabos.org/2008/05/eclipseqtsvn/#comments</comments>
		<pubDate>Fri, 09 May 2008 11:00:21 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[Subversion]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=37</guid>
		<description><![CDATA[Mais como log pessoal do que um tutorial, senti a necessidade de deixar num local de fácil acesso, as etapas de configuração do eclipse para meu próprio uso, ou seja, a instalação do eclipse e dos plugins que eu normalmente uso (svn e qt). Os comandos que afetam diretórios fora de seu home, precisarão de [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">Mais como log pessoal do que um tutorial, senti a necessidade de deixar num local de fácil acesso, as etapas de configuração do eclipse para meu próprio uso, ou seja, a instalação do eclipse e dos plugins que eu normalmente uso (svn e qt).</p>
<blockquote><p><strong>Os comandos que afetam diretórios fora de seu home, precisarão de permissão de superusuário.</strong></p></blockquote>
<p align="justify">Se você resolveu instalar o eclipse apartir dos pacotes disponíveis em sua distribuição, pode pular direto para o passo #2.</p>
<h3>Passo #0: Instalação do Java</h3>
<p>Para que o eclipse funcione, vc precisa do Java Runtime Environment (JRE) instalado *E* configurado.</p>
<p align="justify">O JRE pode ser baixado direto do site da Sun <a href="http://java.sun.com/javase/downloads/index.jsp" class="snap_shots">http://java.sun.com/javase/downloads/index.jsp</a>. Instruções completas de instalação e configuração podem ser encontradas em <a href="http://java.sun.com/javase/6/webnotes/install/index.html"class="snap_shots">http://java.sun.com/javase/6/webnotes/install/index.html</a>, para o caso do JRE 6.</p>
<h3>Passo #1: Donwload e instalação do eclipse</h3>
<p align="justify">O eclipse pode ser facilmente baixado a partir da área de downloads no seu site oficial: <a href="http://www.eclipse.org/downloads" class="snap_shots">http://www.eclipse.org/downloads</a>. Após o download, basta descompactá-lo e sair usando. No meu caso eu usei:</p>
<p align="justify">

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">user<span style="color: #000000; font-weight: bold;">@</span>host$ <span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-xvzf</span> eclipse-cpp-europa-winter-linux-gtk.tar.gz <span style="color: #660033;">-C</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">local</span></pre></div></div>

</p>
<p align="justify">Se tudo deu certo o executável do eclipse estará em <strong>/usr/local/eclipse/eclipse</strong>, daí é só criar um link/atalho/whatever no seu ambiente gráfico favorito.</p>
<h3>Passo #2: Download e instalação do plugin de integração com o QT</h3>
<p align="center"><a href="http://img.blabos.org/blog/posts/37/qteclipse.png" class="snap_shots"><br />
<img src="http://img.blabos.org/blog/posts/37/qteclipse.png" alt="Qt Eclipse Integration" width="200" height="150" hspace="2" vspace="2" border="2" /></a><a href="http://img.blabos.org/blog/posts/37/qteclipseconfig.png" class="snap_shots"><img src="http://img.blabos.org/blog/posts/37/qteclipseconfig.png" alt="Qt Eclipse Configuration" width="200" height="150" hspace="2" vspace="2" border="2" /></a></p>
<p align="justify">O plugin que eu atualmente uso é o fornecido pela própria Trolltech. Nele você pode gerenciar os seus arquivos de projeto a partir de um pequeno editor gráfico, e ainda se preferir, tem acesso direto ao arquivo <strong>.pro</strong>.</p>
<p align="justify">O download pode ser feito a partir de <a href="http://trolltech.com/developer/downloads/qt/eclipse-integration-download" class="snap_shots">http://trolltech.com/developer/downloads/qt/eclipse-integration-download</a>, e a instalação cujas instruções completas podem ser encontradas em <a href="http://trolltech.com/developer/downloads/qt/qteclipse-installmanual" class="snap_shots">http://trolltech.com/developer/downloads/qt/qteclipse-installmanual</a>, é complicadíssima:</p>
<p align="justify">

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">user<span style="color: #000000; font-weight: bold;">@</span>host$ <span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-xvzf</span> qt-eclipse-integration-linux.x86-gcc3.3-1.4.0.tar.gz <span style="color: #660033;">-C</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">local</span></pre></div></div>

</p>
<p align="justify">Se tudo deu certo, os arquivos do plugin foram copiados para o diretório <strong>/usr/local/eclipse/plugins</strong>.</p>
<blockquote><p><strong>Nota</strong>: Para quem optou pela instalação do eclipse através dos pacotes da distribuição, atenção!!! Dentro do arquivo compactado, há o diretório eclipse/plugins/, e dento dele os arquivos do plugin, que devem ser copiados para o diretório de plugins da instalação do seu eclipse, normalmente /usr/lib/eclipse/plugins.</p></blockquote>
<p align="justify">Após a instalação, inicie o eclipse com o comando:</p>
<p align="justify">

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">user<span style="color: #000000; font-weight: bold;">@</span>host$ <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>eclipse<span style="color: #000000; font-weight: bold;">/</span>eclipse <span style="color: #660033;">-clean</span></pre></div></div>

</p>
<p align="justify">Agora, vá em Window&gt;Preferences&gt;Qt e ajuste a versão e os &#8220;pathes&#8221;, de acordo com a sua instalação do Qt.</p>
<p align="justify">Para ficar mais cômodo, se você invoca o eclipse direto da linha de comando, adicione o diretório do seu executável na variável de ambiente $PATH, dentro de algum dos scripts de inicialização (.bash_profile)</p>
<p align="justify">

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PATH</span>=<span style="color: #007800;">$PATH</span>:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>eclipse</pre></div></div>

</p>
<h3>Passo #3: Subversion</h3>
<p align="justify">No eclipse vá em Help&gt;Softwares Updates&gt;Find and Install. Marke a opção Search for new features to install e clique em Next. Agora adicione os sites remotos:</p>
<p align="justify">Buckminster</p>
<p>http://download.eclipse.org/tools/buckminster/updates</p>
<p align="justify">SubClipse</p>
<p>http://subclipse.tigris.org/update_1.2.x</p>
<p align="justify">Marque os respectivos checkboxes, e clique em Finish. Depois de uma pequena consulta à internet, é só marcar o plugin e dependências e correr pro abraço.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2008/05/eclipseqtsvn/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Iniciando no QT, parte III &#8211; qmake e .pro</title>
		<link>http://blog.blabos.org/2008/05/iniciando-no-qt-parte-iii/</link>
		<comments>http://blog.blabos.org/2008/05/iniciando-no-qt-parte-iii/#comments</comments>
		<pubDate>Wed, 07 May 2008 11:00:05 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=36</guid>
		<description><![CDATA[Neste terceiro post sobre QT vamos falar do utilitário qmake e dos arquivos de projeto *.pro. Vamos entender para que serve o qmake e como configurar diferentes tipos de projetos. O qmake O qmake é um utilitário que acompanha o framework QT. Sua função é parsear um arquivo de projeto (*.pro) e gerar um Makefile [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">Neste terceiro post sobre QT vamos falar do utilitário qmake e dos arquivos de projeto <strong>*.pro</strong>. Vamos entender para que serve o qmake e como configurar diferentes tipos de projetos.</p>
<h3 align="left">O qmake</h3>
<p align="justify">O qmake é um utilitário que acompanha o framework QT. Sua função é parsear um arquivo de projeto (*.pro) e gerar um Makefile já com as regras do <a href="http://doc.trolltech.com/4.4/moc.html" class="snap_shots">moc</a>, <a href="http://doc.trolltech.com/4.4/uic.html" class="snap_shots">uic</a> e opções do QT embutidas. Sem ele por exemplo, teríamos que chamar o moc explicitamente para criar os arquivos moc_* e passar explicitamente para o compilador e linker, as opções corretas para incluir o QT aos nossos projetos.</p>
<p align="justify">A documentação oficial sobre o qmake e arquivos de projeto, pode ser encontrada <a href="http://doc.trolltech.com/4.4/qmake-manual.html" class="snap_shots">aqui</a>.</p>
<h3>Arquivos de projeto *.pro</h3>
<p align="justify">Para criar um arquivo de projeto simples pela linha de comando, entramos no diretório do projeto e digitamos:</p>
<p align="justify">

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">user<span style="color: #000000; font-weight: bold;">@</span>host$ qmake <span style="color: #660033;">-project</span></pre></div></div>

<p align="justify">Feito isso, será criado um arquivo com o mesmo nome do diretório corrente, seguido da extensão <strong>.pro</strong>. Caso já existam nesse diretório arquivos reconhecidos pelo qmake, como arquivos de códigos fontes (.h, .cpp), forms (.ui), etc, eles serão automaticamente adicionados ao arquivo de projeto.</p>
<p align="justify">Criado o arquivo .pro, ao executarmos qmake sem argumentos ele tentará parsear um arquivo .pro com o mesmo nome do diretório corrente. Você ainda pode especificar um arquivo de projeto alternativo como argumento para o qmake. Se tudo deu certo, um arquivo Makefile foi criado, e com  um simples make, podemos compilar o projeto.</p>
<p align="justify">Os arquivos de projeto são arquivos de texto normais, contendo macros e diretivas que serão interpretadas pelo qmake para criar o Makefile. A lista completa de opções pode ser encontrada na documentação <a href="http://doc.trolltech.com/4.4/qmake-manual.html" class="snap_shots">online</a>. As mais comuns são:</p>
<p align="justify"><strong>TEMPLATE</strong>: Indicam o tipo de projeto. Use &#8216;app&#8217; para proramas executáveis ou &#8216;lib&#8217; para criar bibliotecas.</p>
<p align="justify"><strong>CONFIG</strong>: Adicionam opções diversas ao projeto. Entre elas, &#8216;debug&#8217; para adicionar informações de depuração, &#8216;staticlib&#8217; em conjunto com o template &#8216;lib&#8217;, para que abiblioteca criada seja estática (.a no linux).</p>
<p align="justify"><strong>TARGET</strong>: O nome e a localização do alvo, ou seja, do aplicativo ou biblioteca.</p>
<p align="justify"><strong>MOC_DIR</strong>: Diretório onde serão grados os arquivos moc_*. Útil para não poluir o diretório de códigos fontes.</p>
<p align="justify"><strong>OBJECTS_DIR</strong>: Complementar à opção anterior, indica o diretório onde serão gerados os aquivos de código objeto (*.o).</p>
<p align="justify"><strong>INCLUDEPATH</strong>: Diretórios externos onde existem headers que serão utilizados no projeto, como headers de bibliotecas externas.</p>
<p align="justify"><strong>DEPENDPATH</strong>: Diretórios de códigos fontes externos que serão utilizados pelo projeto.</p>
<p align="justify"><strong>HEADERS</strong>: Os arquivos de cabeçalho do projeto (*.h).</p>
<p align="justify"><strong>FORMS</strong>: arquivos de interface gerados com o QtDesigner (*.ui).</p>
<p align="justify"><strong>SOURCES</strong>: Os arquivos de implementação de código fonte do projeto (*.cpp).</p>
<p align="justify"><strong>LIBS</strong>: Bibliotecas externas utilizadas pelo projeto. -L indica o path para a biblioteca, e -l diz o nome da biblioteca.</p>
<p align="justify"><strong>QT</strong>: Módulos do QT que devem ser adicionados/excluidos do projeto. Se for passado &#8216;QT =&#8217; (QT igual vazio), nenhum módulo QT será utilizado no projeto.</p>
<p align="justify"><strong>SUBDIRS</strong>: Utilizado em conjunto com o template &#8216;subdirs&#8217;, indica os subdiretórios ons o qmake deve procurar por outros arquivos de projeto.</p>
<p align="justify">Com isso em mãos podemos criar algums projetos simples.</p>
<h4>Um aplicativo simples:</h4>
<p align="justify">

<div class="wp_syntax"><div class="code"><pre class="qt" style="font-family:monospace;"># O primeiro caracter desta linha cria um comentário
# O nome deste arquivo é 'app.pro'
TEMPLATE     =  app            # Nosso template é um aplicativo chamado
TARGET       =  bin/myapp.bin  # myapp.bin, dentro do dir ./bin
MOC_DIR      =  tmp/moc        # Diretório para mocs, opcional
OBJECTS_DIR  =  tmp/obj        # Diretório para código objeto, opcional
HEADERS      += myclass.h      # Header da classe MyClass
SOURCES      += main.cpp      # Utilize  para organizar os arquivos em
                myclass.cpp    # várias linhas.</pre></div></div>

</p>
<h4>Uma biblioteca simples:</h4>
<p align="justify">

<div class="wp_syntax"><div class="code"><pre class="qt" style="font-family:monospace;"># O nome deste arquivo é 'lib.pro'
TEMPLATE     =  lib            # Nosso template é uma biblioteca
CONFIG       += dll            # dinâmica, chamada
TARGET       =  lib/mylib      # mylib, dentro do dir ./lib
MOC_DIR      =  tmp/moc        # Diretório para mocs, opcional
OBJECTS_DIR  =  tmp/obj        # Diretório para código objeto, opcional
HEADERS      += myclass.h      # Header da classe MyClass
SOURCES      += myclass.cpp    # Implementação da classe MyClass</pre></div></div>

</p>
<h4>Um aplicativo que usa uma biblioteca externa:</h4>
<p align="justify">

<div class="wp_syntax"><div class="code"><pre class="qt" style="font-family:monospace;"># O nome deste arquivo é 'mixed.pro'
TEMPLATE     =  app            # Nosso template é um aplicativo chamado
TARGET       =  bin/myapp.lkd  # myapp.lkd, dentro do dir ./bin
MOC_DIR      =  tmp/moc        # Diretório para mocs, opcional
OBJECTS_DIR  =  tmp/obj        # Diretório para código objeto, opcional
INCLUDEPATH  += .              # Dir onde estão os Headers da lib externa
SOURCES      += main.cpp       # Implementação do aplicativo.</pre></div></div>

</p>
<h4>Diretórios aninhados:</h4>
<p align="justify">Para utilizarmos diretórios aninhados, precisamos de um arquivo de projeto no diretório atual, e outro no subdiretório.</p>
<p align="justify">No diretório atual, utilizamos as opções:</p>

<div class="wp_syntax"><div class="code"><pre class="qt" style="font-family:monospace;">TEMPLATE = subdirs
SUBDIRS  = [lista de subdirs para serem compilados em sequência]</pre></div></div>

</p>
<p align="justify">Caso seja fornecido apenas o nome do diretório, ele precisa conter uma arquivo de projeto com o seu próprio nome. É possível no entando, informar diretamente na lista de subdiretórios, um diretório seguido por um arquivo de projeto com quaquer nome.</p>
<p align="justify">O código fonte completo dos exemplos abordados neste tutorial pode ser encontrado <a href="http://src.blabos.org/blog/posts/36/qmake-test.tar.gz">aqui</a>.</p>
<h3>Concluindo</h3>
<p align="justify">O qmake é uma ferramenta simples e muito poderosa que facilita enormemente a vida de quem tem de gerenciar aŕvores de projeto complexas, mesmo que o projeto não utilize QT (basta acrescentar no final a opção &#8216;QT = &#8216;). Adicione a isso o fato de os arquivos de projeto terem uma sintaxe bastante simples e até certo ponto intuitiva. Se você precisar de ajustes mais finos, a documentação <a href="http://doc.trolltech.com/4.4/qmake-manual.html" class="snap_shots">online</a> lhe dará uma dezena de opções para se divertir.</p>
<p align="justify">Com QT ou sem QT, o qmake é sempre uma boa opção para gerenciamento de árvore de build.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2008/05/iniciando-no-qt-parte-iii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Iniciando no QT, parte II &#8211; Sinais, Slots e Timers</title>
		<link>http://blog.blabos.org/2008/02/iniciando-no-qt-parte-ii-sinais-slots-e-timers/</link>
		<comments>http://blog.blabos.org/2008/02/iniciando-no-qt-parte-ii-sinais-slots-e-timers/#comments</comments>
		<pubDate>Fri, 01 Feb 2008 09:59:25 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://blabos.org/blog/?p=17</guid>
		<description><![CDATA[Neste post vou seguindo com a brincadeira de fazer pequenos tutoriais sobre o QT para iniciantes. Desta vez vou mostrar como criar nossos próprios sinais e slots e como manipular um timer. O código fonte pode ser encontrado neste link. O programa de exemplo será um cronômetro que vai utilizar a classe QTimer, uma das [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">Neste post vou seguindo com a brincadeira de fazer pequenos tutoriais sobre o QT para iniciantes. Desta vez vou mostrar como criar nossos próprios sinais e slots e como manipular um timer.</p>
<p align="justify">O código fonte pode ser encontrado neste <a href="http://src.blabos.org/blog/posts/17/stopwatch.zip">link</a>.</p>
<p align="justify">O programa de exemplo será um cronômetro que vai utilizar a classe <a href="http://doc.trolltech.com/4.3/qtimer.html" class="snap_shots">QTimer</a>, uma das principais classes do QT, e vai mostrar o tempo utilizando um display estilo LCD de calculadora com a classe <a href="http://doc.trolltech.com/4.3/qlcdnumber.html" class="snap_shots">QLCDNumber</a>.</p>
<h3>QT e os Timers</h3>
<p align="justify">O suporte mais básico a timers no QT é disponibilizado pela classe QObject, que fornece os métodos <a href="http://doc.trolltech.com/4.3/qobject.html#startTimer" class="snap_shots">QObject::startTimer()</a> e <a href="http://doc.trolltech.com/4.3/qobject.html#killTimer" class="snap_shots">QObject::killTimer()</a>. O primeiro método retorna um ID único de timer e o segundo finaliza o timer através desse ID.</p>
<p align="justify">Para que isso funcione, no entanto, o trecho de código que utiliza esse mecanismo precisa estar dentro de um &#8220;event loop&#8221;. A partir do momento que o timer for iniciado ele de tempos em tempos (timeout) faz com que a aplicação dispate um <a href="http://doc.trolltech.com/4.3/qtimerevent.html" class="snap_shots">QTimerEvent</a>, que interrompe o fluxo normal do programa até que o evento seja processado.</p>
<p align="justify">O tempo máximo de timeout não é delimitado, sendo possível criar timers com timeout de anos, porém, o tempo mínimo pode variar de sistema para sistema. No windows Vista o timer mínimo é de 10 ms enquanto no Linux 2.6.x isso é configurável (o default é 4 ms). O QT vai tentar entregar todos os eventos, conforme pedidos, mas caso o sistema não permita ele vai descartar os &#8220;excedentes&#8221;.</p>
<p align="justify">Timers também podem ser utilizados em threads, porém deve-se respeitar a condição de estar dentro de um event loop. Threads merecem um artigo à parte, como sempre&#8230;</p>
<p align="justify">A classe <a href="http://doc.trolltech.com/4.3/qtimer.html" class="snap_shots">QTimer</a> implementa timers de mais alto nível, possibilitando algumas funcionalidades. Uma delas é o <a href="http://doc.trolltech.com/4.3/qtimer.html#singleShot" class="snap_shots">QTimer::singleShot()</a>, que dispara um evento uma única vez.</p>
<p align="justify">Leia a extensa e repetitiva documentação, é chato, mas acredite, vai te poupar de muita QDorDeCabeca&#8230;</p>
<h3>Mais sobre Sinais e Slots</h3>
<p align="justify">Sinais e slots são utilizados para comunicação entre objetos, sendo uma das peças fundamentais do QT. Nesse sistema ao invés de se implementar callbacks para tratar eventos, utiliza-se o conceito de conectar sinais a slots, tornando a programação mais intuitiva.</p>
<p align="justify">Os sinais e slots são métodos de classe que são tratados pelo <a href="http://doc.trolltech.com/4.3/moc.html#moc" class="snap_shots">Meta-Object Compiler (moc)</a> antes do código fonte ser compilado. Eles têm declarações especiais que não são parte do padrão C++, por isso o moc fazum parsing e gera o código fonte compilável.</p>
<p align="justify">Ao executar o comando moc sobre qualquer classe que implemente sinais e slots, uma certa quantidade de código fonte é gerada. Com o uso do programa <a href="http://doc.trolltech.com/4.3/qmake-manual.html" class="snap_shots">qmake</a>, a chamada ao programa moc fica a cargo do Makefile, tornando-a transparente para o programador.</p>
<p align="justify">Para que uma classe possa implementar sinais e slots, ela precisa ter acesso ao <a href="http://doc.trolltech.com/4.3/metaobjects.html" class="snap_shots">Meta-Object System</a>. Por isso ela deve herdar da classe <a href="http://doc.trolltech.com/4.3/qobject.html" class="snap_shots">QObject</a> ou suas subclasses, e precisa ter a macro <a href="http://doc.trolltech.com/4.3/qobject.html#Q_OBJECT" class="snap_shots">Q_OBJECT</a> na sua área de declaração privada. Terminados os preparativos, sinais são declarados em uma seção &#8220;<strong>signals:</strong>&#8221; e slots em seções &#8220;<strong>[public|protected|private] slots:</strong>&#8220;.</p>
<p align="justify">Um slot, depois de declarado, é então definido como qualquer outro método comum, podendo ser explicitamente chamado como qualquer outro. Já os sinais, são um pouco mais delicados, e são apenas declarados e jamais definidos pelo programador. A razão? Esta mensagem no final da tentativa de compilação:</p>
<pre>
tmp/moc_mydisplay.o: In function `MyDisplay::signalPlay()':
~/stopwatch/tmp/moc_mydisplay.cpp:89: multiple definition of `MyDisplay::signalPlay()'
tmp/mydisplay.o:~/stopwatch/mydisplay.cpp:169: first defined here
collect2: ld returned 1 exit status
make: ** [stopwatch] Erro 1
</pre>
<p align="justify">Dentro do arquivo <strong>moc_mydisplay.cpp</strong> é gerado o seguinte código:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp-qt" style="font-family:monospace;"><span style="color: #888888;">// SIGNAL 0</span>
<span style="color: #0057AE;">void</span> MyDisplay<span style="color: #006E28;">::</span><span style="color: #2B74C7;">signalPlay</span><span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span>
<span style="color: #006E28;">&#123;</span>
    <span style="color: #22aadd;">QMetaObject</span><span style="color: #006E28;">::</span><span style="color: #2B74C7;">activate</span><span style="color: #006E28;">&#40;</span><span style="color: #000000; font-weight:bold;">this</span><span style="color: #006E28;">,</span> <span style="color: #006E28;">&amp;</span>staticMetaObject<span style="color: #006E28;">,</span> <span style="color: #B08000;">0</span><span style="color: #006E28;">,</span> <span style="color: #B08000;">0</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
<span style="color: #006E28;">&#125;</span></pre></div></div>

<p align="justify">Sim, o moc gera a definição dos sinais com chamadas a meta-métodos do QT. Portanto, definir o corpo de um sinal é ilegal no QT e vai gerar um erro de compilação por redefinição de método. Deixe que o moc cuida da implementação do sinal pra você.</p>
<h3>Conecte-se</h3>
<p align="justify">Não adianta apenas definir sinais e slots. É preciso definir como eles vão interagir. A maneira de fazer isso é conectando-os através do método <strong>connect()</strong> presente em todo herdeiro de <a href="http://doc.trolltech.com/4.3/qobject.html" class="snap_shots">QObject</a>. Isso fará o moc implementar o sinal de forma que uma chamada a ele resulte numa chamada ao(s) slot(s) conectado(s), com os mesmos parâmetros.</p>
<p align="justify">Dependendo da forma de conexão, um sinal pode até retornar o mesmo valor que o último slot chamado retornar. Note que isso não é muito seguro para sinais conectados a vários slots, pois, nada garante a ordem de chamada.</p>
<p align="justify">Um dado sinal pode ser conectado a um segundo sinal diretamente. Um <strong>emit()</strong> no primeiro sinal é então equivalente a um <strong>emit()</strong> no segundo sinal, visto que após a etapa de criação dos mocs, a chamada ao primeiro resulta na chamada ao segundo, que resulta na chamada de outro método conectado e assim sucessivamente.</p>
<h3>Formas de conexão</h3>
<p align="justify">Existem basicamente <strong>três</strong> formas de conectar sinais e slots e se não usadas adequadamente podem ser fonte de bugs terrivelmente difíceis de se descobrir. Essas formas de conexão são passadas como parâmetros extras para o método <strong>connect()</strong>. São elas:</p>
<p align="justify"><a href="http://doc.trolltech.com/4.3/threads.html#signals-and-slots-across-threads" class="snap_shots">Conexão Direta</a>: O slot é chamado imediatamente ao sinal ter sido emitido, na thread onde o sinal foi emitido. Isso funciona como uma chamada direta ao slot.</p>
<p align="justify"><a href="http://doc.trolltech.com/4.3/threads.html#signals-and-slots-across-threads" class="snap_shots">Conexão Enfileirada</a>: O sinal é emitido e a chamada ao slot vai para uma lista interna do QT, e o sinal retorna imediatamente, independentemente do slot ter sido chamado ou não. O evente loop vai então processando essa lista e só mais tarde o slot será invocado na thread onde o objeto do slot reside.</p>
<p align="justify"><a href="http://doc.trolltech.com/4.3/threads.html#signals-and-slots-across-threads" class="snap_shots">Conexão Automática</a>: Este é o tipo default, utilizado quando não se especifica o tipo de conexão. É uma das <a href="http://www.he-man.org/cartoon/cmotu-pop/universe/evilseed.shtml" class="snap_shots">&#8220;Sementes do Mal&#8221;</a>, pois apresenta dois comportamentos distintos: se o sinal e o slot residirem em uma mesma thread, funciona como conexão direta, mas caso contrário, funciona como conexão enfileirada.</p>
<p align="justify"><a href="http://doc.trolltech.com/4.3/qt.html#ConnectionType-enum" class="snap_shots">Conexão enfileirada Bloqueante</a>: Ué!? não eram só <strong>três</strong>? Well, essa é uma das vantagens de ler esse artigo: te salva de documentação inconsitente! Essa conexão é semelhante à conexão enfileirada, exceto pelo fato de que a thread do sinal fica bloqueada até o sinal ser devidamente executado. Note que só deve se utilizada com muito cuidado, e para sinais e slots em threads diferentes. O mal uso disso poderá causar deadlocks. Você vai saber quando vir algo assim:</p>
<pre>
user@host:~/stopwatch$ ./stopwatch
Qt: Dead lock detected while activating a BlockingQueuedConnection: Sender is
QPushButton(0x807e2d8), receiver is MyDisplay(0x8076ac0)
</pre>
<p align="justify">Para sanar as dúvidas a respeito do que significa a expressão <a href="http://doc.trolltech.com/4.3/threads.html#per-thread-event-loop" class="snap_shots">&#8220;thread onde um objeto reside&#8221;</a> consulte a documentação do QT arespeito de threads.</p>
<p align="justify">Tome sempre muito cuidado com sinais, slots, timers e threads. Esses são recursos fundamentais do QT, mas o seu mal uso pode acarretar em bugs extremamente difíceis de serem localizados. Consulte toda a documentação à respeito.</p>
<h3>Descendo à fonte</h3>
<p align="justify">O nosso exemplo se compões de duas classes MyDisplay e StopWatch e um arquivo main comum. O main apenas cria uma QApplication e um objeto StopWatch. A classe MyDisplay cuida da parte visual do programa, consistindo em um diálogo com botões e um display no estilo LCD. A classe StopWatch vai criar um widget de display e implementar o timer. Note que essa arquitetura não é a mais elegente, sendo mais interessante fazer a classe StopWatch herdar de MyDisplay. Porém, isso estragaria a brincadeira praticamente eliminando a necessidade do uso de sinais e slots.</p>
<p align="justify">O uso de sinais e slots fica mais claro quando queremos que objetos se comuniquem com o seu exterior. Em geral, as classes não conhecem o que há fora delas. Passar ponteiros de objetos externos para dentro delas, fere o encapsulamento e torna o código menos genérico. Em nosso exemplo, o uso mais interessante para sinais e slots é para o objeto myDisplay (interno a StopWatch) comunicar eventos de/para o objeto stopwatch (externo a Mydisplay), sem que para isso se perca em generalidade ou encapsulamento.</p>
<p align="justify">Com a ajuda do QT Designer (num outro artigo eu falarei dele), criei o diálogo, botões e LCD. Depois simplifiquei o código para se adequar aos nossos propósitos. Como myDisplay herda de QDialog e este herda indiretamente de QObject, para usarmos sinais e slots bastou acrescentar a macro Q_OBJECT na seção privada da declaração da classe. Após isso, acrescentei entre outros auxiliares, os métodos:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp-qt" style="font-family:monospace;"><span style="color: #0057AE;">public</span> <span style="color: #0057AE;">slots</span><span style="color: #006E28;">:</span>
    <span style="color: #0057AE;">void</span> slotDisplayValue<span style="color: #006E28;">&#40;</span> <span style="color: #0057AE;">long</span> <span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
&nbsp;
<span style="color: #0057AE;">private</span> <span style="color: #0057AE;">slots</span><span style="color: #006E28;">:</span>
    <span style="color: #0057AE;">void</span> slotPlay<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
    <span style="color: #0057AE;">void</span> slotStop<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
&nbsp;
<span style="color: #0057AE;">signals</span><span style="color: #006E28;">:</span>
    <span style="color: #0057AE;">void</span> signalPlay<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
    <span style="color: #0057AE;">void</span> signalPause<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
    <span style="color: #0057AE;">void</span> signalStop<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
    <span style="color: #0057AE;">void</span> signalReset<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span></pre></div></div>

<p align="justify">Os sinais comunicarão ao exterior os eventos relacionados aos cliques nos botões. Já os slots privados farão um pré-processamento interno, enquanto o público receberá o valor de ticks vindo do timer externo. Dessa forma a classe envia informações ao exterior e recebe informações de fora, sem conhecer o que está do outro lado. A boa e velha interface por contrato.</p>

<div class="wp_syntax"><div class="code"><pre class="cpp-qt" style="font-family:monospace;"><span style="color: #0057AE;">public</span> <span style="color: #0057AE;">slots</span><span style="color: #006E28;">:</span>
    <span style="color: #0057AE;">void</span> slotPlay<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
    <span style="color: #0057AE;">void</span> slotPause<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
    <span style="color: #0057AE;">void</span> slotStop<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
    <span style="color: #0057AE;">void</span> slotReset<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
&nbsp;
<span style="color: #0057AE;">private</span> <span style="color: #0057AE;">slots</span><span style="color: #006E28;">:</span>
    <span style="color: #0057AE;">void</span> slotTick<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
&nbsp;
<span style="color: #0057AE;">signals</span><span style="color: #006E28;">:</span>
    <span style="color: #0057AE;">void</span> signalTicks<span style="color: #006E28;">&#40;</span> <span style="color: #0057AE;">long</span> <span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span></pre></div></div>

<p align="justify">Análoga e inversamente a classe StopWatch implementa os slots que receberão os sinais da classe MyDisplay, e declara o sinal que enviará informações para o seu slot público.</p>
<p align="justify">Ela também implementa um QTimer que vai disparar a cada 10 milissegundos (para que os nosso amigos lerdinhos do Vista possam acompanhar!), incrementando um contador. Esse contador é enviado de volta ao display que o formata e exibe.</p>
<p align="justify">O cronômetro pode ser parado, pausado e reiniciado a qualquer momento, clicando nos botões correspondentes.</p>
<h3>Os Finalmentes</h3>
<p align="justify">O exemplo em si não tem muito código, mas ilustra o uso mais básico de timers e a construção de sinais e slots customizados. Uma atenção toda especial, no entanto, deve ser dada aos detalhes que envolvem o uso desses recursos, pois eles podem se tornar armadilhas letais.</p>
<h3>Links importantes</h3>
<p><a href="http://doc.trolltech.com/4.3/signalsandslots.html" class="snap_shots">Sinais e Slots</a><br />
<a href="http://doc.trolltech.com/4.3/qtimer.html" class="snap_shots">QTimer</a><br />
<a href="http://doc.trolltech.com/4.3/threads.html" class="snap_shots">Threads no QT</a><br />
<a href="http://doc.trolltech.com" class="snap_shots">Documentação on-line do QT</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2008/02/iniciando-no-qt-parte-ii-sinais-slots-e-timers/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Iniciando no QT, parte I</title>
		<link>http://blog.blabos.org/2008/01/iniciando-no-qt-parte-i/</link>
		<comments>http://blog.blabos.org/2008/01/iniciando-no-qt-parte-i/#comments</comments>
		<pubDate>Sat, 26 Jan 2008 16:50:45 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://blabos.org/blog/?p=13</guid>
		<description><![CDATA[Atendendo a pedidos, resolvi fazer breve artigo mostrando com começar a se aventurar com o QT. Em apanas 20 linhas, contando com as de espaço (sim, o espaço é seu amigo, nunca o abandone) e os cabeçalhos extras, podemos fazer um &#8220;Hello World&#8221; gráfico, que já utiliza as principais funcionalidades do framework. Como eu não [...]]]></description>
			<content:encoded><![CDATA[<p ALIGN="justify">Atendendo a pedidos, resolvi fazer breve artigo mostrando com começar a se aventurar com o QT.</p>
<p ALIGN="justify">Em apanas 20 linhas, contando com as de espaço (sim, o espaço é seu amigo, nunca o abandone) e os cabeçalhos extras, podemos fazer um &#8220;Hello World&#8221; gráfico, que já utiliza as principais funcionalidades do framework.</p>
<p ALIGN="justify">Como eu não tenho como testar em outras plataformas, estou assumindo que a plataforma utilizada é algum *nix, e que as bibliotecas de desenvolvimento do QT já estão instaladas, bem como as ferramentas de compilação padrão. Caso o QT não esteja instalado, é hora de dar uma olhada neste <a CLASS="snap_shots" HREF="http://doc.trolltech.com/4.3/installation.html">link</a>.</p>
<p ALIGN="justify">O código fonte completo do exemplo pode ser baixado <a HREF="http://blabos.org/blog/wp-content/uploads/2008/01/qthello.zip">aqui</a>, mas se preferir fazer tudo na mão, crie um diretório qthello num lugar qualquer e dentro dele um arquivo chamado main.cpp com o seguinte conteúdo:</p>
<p ALIGN="justify">&nbsp;</p>

<div class="wp_syntax"><div class="code"><pre class="cpp-qt" style="font-family:monospace;"><span style="color: #208080;">01</span> <span style="color: #006E28;">#include &lt;qapplication&gt;</span>
<span style="color: #208080;">02</span> <span style="color: #006E28;">#include &lt;qwidget&gt;</span>
<span style="color: #208080;">03</span> <span style="color: #006E28;">#include &lt;qpushButton&gt;</span>
<span style="color: #208080;">04</span>
<span style="color: #208080;">05</span> <span style="color: #0057AE;">int</span> main<span style="color: #006E28;">&#40;</span> <span style="color: #0057AE;">int</span> argc <span style="color: #006E28;">,</span> <span style="color: #0057AE;">char</span><span style="color: #006E28;">**</span> argv <span style="color: #006E28;">&#41;</span>
<span style="color: #208080;">06</span> <span style="color: #006E28;">&#123;</span>
<span style="color: #208080;">07</span>     <span style="color: #22aadd;">QApplication</span> app<span style="color: #006E28;">&#40;</span> argc <span style="color: #006E28;">,</span> argv <span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
<span style="color:#800080;">08</span>     <span style="color: #22aadd;">QWidget</span> window<span style="color: #006E28;">;</span>
<span style="color:#800080;">09</span>     <span style="color: #22aadd;">QPushButton</span> button<span style="color: #006E28;">&#40;</span> <span style="color: #BF0303;">&quot;Hello World!&quot;</span> <span style="color: #006E28;">,</span> <span style="color: #006E28;">&amp;</span>window <span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
<span style="color: #B08000;">10</span>
<span style="color: #B08000;">11</span>     window.<span style="color: #2B74C7;">resize</span><span style="color: #006E28;">&#40;</span> <span style="color: #B08000;">300</span> <span style="color: #006E28;">,</span> <span style="color: #B08000;">200</span> <span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
<span style="color: #B08000;">12</span>     button.<span style="color: #2B74C7;">setGeometry</span><span style="color: #006E28;">&#40;</span> <span style="color: #B08000;">100</span> <span style="color: #006E28;">,</span> <span style="color: #B08000;">85</span> <span style="color: #006E28;">,</span> <span style="color: #B08000;">100</span> <span style="color: #006E28;">,</span> <span style="color: #B08000;">30</span> <span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
<span style="color: #B08000;">13</span>
<span style="color: #B08000;">14</span>     <span style="color: #22aadd;">QObject</span><span style="color: #006E28;">::</span><span style="color: #0057AE;">connect</span><span style="color: #006E28;">&#40;</span> <span style="color: #006E28;">&amp;</span>button <span style="color: #006E28;">,</span> SIGNAL<span style="color: #006E28;">&#40;</span> clicked<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span> <span style="color: #006E28;">&#41;</span> <span style="color: #006E28;">,</span>
                         <span style="color: #006E28;">&amp;</span>app    <span style="color: #006E28;">,</span> SLOT<span style="color: #006E28;">&#40;</span> quit<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span> <span style="color: #006E28;">&#41;</span> <span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
<span style="color: #B08000;">15</span>
<span style="color: #B08000;">16</span>     window.<span style="color: #2B74C7;">show</span><span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
<span style="color: #B08000;">17</span>     <span style="color: #000000; font-weight:bold;">return</span> app.<span style="color: #2B74C7;">exec</span><span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
<span style="color: #B08000;">19</span> <span style="color: #006E28;">&#125;</span>
<span style="color: #B08000;">20</span></pre></div></div>

<p ALIGN="justify">Agora acesse através de um terminal o diretório criado e digite <strong>qmake -project</strong>.</p>
<p ALIGN="justify">Se tudo estiver instalado direitinho, um arquivo chamado <strong>qthello.pro</strong> deve ter sido criado. Se não houver nenhum qthello.pro no diretório, então revise os passo anteriores.</p>
<p ALIGN="justify">Com tudo acertado digite no terminal <strong>qmake &amp;&amp; make</strong>. Isso irá compilar o exemplo e se tudo deu certo, um arquivo executável chamado qthello foi criado.</p>
<p ALIGN="justify">Execute-o com <strong>./qthello</strong> e uma janela com um botão deve aparecer.</p>
<p ALIGN="justify">Ok, vamos agora à parte divertida: o código fonte.</p>
<p ALIGN="justify">As três primeiras linhas apenas incluem os cabeçalhos referentes às classes do QT que vamos utilizar.</p>
<p ALIGN="justify">A linha 7 declara uma aplicação QT e passa pra ela os parâmetros recebidos do shell pelo programa. A classe QApplication gerencia o fluxo principal do programa e suas configurações. Ela contém o loop principal de eventos, onde todos os eventos vindos tanto da interface quanto de outras fontes são processados e despachados. Ela também gerencia a inicialização e finalização do programa entre outras coisinhas.</p>
<p ALIGN="justify">A linha 8 declara um widget que será o nosso elemento gráfico principal.</p>
<p ALIGN="justify">A linha 9 declara um botão com o texto &#8220;Hello World!&#8221; e torna o mesmo um &#8220;filho&#8221; do nosso widget principal. Isso fará com que o botão apareca dentro do widget principal.</p>
<p ALIGN="justify">As linhas 11 e 12 configuram os componentes quanto à forma e posicionamento.</p>
<p ALIGN="justify">A linha 14 mostra uma das principais funcionalidades do framework, o <strong>Sistema Sinal-Slot</strong>.</p>
<p ALIGN="justify">Sinais e slots são utilizados para realizar a comunicação entre os objetos. Através desse sistema um objeto pode disparar (emit) um evento (sinal) que pode ser capturado e processado por um (ou mais) objeto(s). Sinais e slots são métodos especiais da classe. Basicamente, a emissão de um sinal é traduzida para a chamada ao slot correspondente através do <a CLASS="snap_shots" HREF="http://doc.trolltech.com/4.3/moc.html">moc (meta-object compiler)</a>, que pré-processa o código fonte antes da compilação. Para cada classe que implementar sinais e slots, é gerado um arquivo chamado moc_nomedaclasse.cpp, que depois é compilado junto com o restante do código. Isso tudo é feito de forma transparente e o programador, em geral, não precisa se preocupar com esses detalhes. Em termos práticos, emitir um sinal signigica que o slot associado a ele através de um connect será chamado de alguma forma, com os mesmos parâmetros passados ao sinal. Maiores informações podem ser conferidas na documentação on-line.</p>
<p ALIGN="justify">No nosso exemplo, o connect associa o sinal clicked() do objeto botão, com o slot quit() do objeto aplicação. Isso significa que ao clicar no botão, um sinal é disparado e posteriormente capturado pelo objeto aplicação, que o processa e então finaliza.</p>
<p ALIGN="justify">Na linha 16, chamamos o método show() do widget, para que ele se torne visível.</p>
<p ALIGN="justify">Na linha 17, finalmente passamos o controle do programa para o QT. O método exec() vai disparar o loop principal e todos os seus mecanismos, e só retornará quando a aplicação terminar, no nosso caso, quando app.quit() for chamado através do sistema sinal-slot.</p>
<p ALIGN="justify">Este simples &#8220;Hello World&#8221; pode parecer bobo, mas é suficiente para demonstrar algumas das principais funcionalidades do QT, como o main loop, a criação de objetos gráficos e o uso de sinais e slots.</p>
<p ALIGN="justify">Num próximo post eu vou mostrar com criar nossos próprios sinais e slots e o uso de temporizadores.</p>
<p><strong>Referências:</strong><br />
<a CLASS="snap_shots" HREF="http://doc.trolltech.com/4.3/qapplication.html">QApplication</a><br />
<a CLASS="snap_shots" HREF="http://doc.trolltech.com/4.3/qwidget.html">QWidget</a><br />
<a CLASS="snap_shots" HREF="http://doc.trolltech.com/4.3/qpushbutton.html">QPushButton</a><br />
<a CLASS="snap_shots" HREF="http://doc.trolltech.com/4.3/signalsandslots.html">Sinais e Slots</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2008/01/iniciando-no-qt-parte-i/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Construindo um gerenciador de interface simples para sistemas multi-janelas com QT</title>
		<link>http://blog.blabos.org/2008/01/construindo-um-gerenciador-de-interface-simples-para-sistemas-multi-janelas-com-qt/</link>
		<comments>http://blog.blabos.org/2008/01/construindo-um-gerenciador-de-interface-simples-para-sistemas-multi-janelas-com-qt/#comments</comments>
		<pubDate>Thu, 24 Jan 2008 03:34:59 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://blabos.org/blog/?p=12</guid>
		<description><![CDATA[Em diversas ocasiões acabei tendo que dar manutenção em interfaces de sistemas com muitas telas, sejam elas gráficas ou em modo texto. Muitas vezes, a quantidade de telas foi crescendo junto com o sistema sem um planejamento prévio, o que sempre levava a um emaranhado de chamadas obscuras, #ifndefs, switches, entre outros monstrinhos. A primeira [...]]]></description>
			<content:encoded><![CDATA[<p ALIGN="justify">Em diversas ocasiões acabei tendo que dar manutenção em interfaces de sistemas com muitas telas, sejam elas gráficas ou em modo texto. Muitas vezes, a quantidade de telas foi crescendo junto com o sistema sem um planejamento prévio, o que sempre levava a um emaranhado de chamadas obscuras, #ifndefs, switches, entre outros monstrinhos.</p>
<p ALIGN="justify">A primeira vez que eu me deparei com um problema do gênero, foi quando eu estava fazendo a primeira versão de um jogo parecido com o saudoso <a CLASS="snap_shots" HREF="http://www.elifoot.net">Elifoot</a> para uma feira no CEFETES. Na época eu me deparei com um conjunto de funções onde elas chamavam umas às outras e só retornavam quando acontecia o gol. Resultado: haja pilha!!! (Não se preocupem, na nova versão isso foi corrigido!)</p>
<p ALIGN="justify">No caso das interfaces, com várias janelas, e em sistemas onde o planejamento ocorre on-the-fly, é comum termos janelas que chamam outras janelas que fecham as janelas anteriores e assim por diante, deixando pra trás um rastro de destruição e terror. Acredite, você não vai querer nunca dar manutenção num treco desses.</p>
<h4>Do pó ao pó&#8230;</h4>
<p ALIGN="justify">No meu caso, resovi o problema criando um gerenciador de interface. Um objeto centralizador que controla a criação e destruição dos objetos de interface. Cada objeto, ao terminar suas tarefas, sinaliza para o gerenciador e ele cuida de limpar a sujeira. Assim, um objeto sempre nasce, realiza suas tarefas e morre sem passar o controle do programa para frente, ele sempre volta para o gerenciador.</p>
<p ALIGN="justify">Note que eu não disse que o gerenciador vai destruir o objeto, mas sim que ele vai fazer a limpeza. Cada objeto tem que ser construído de forma a avisar ao gerenciador toda vez que ele terminar, seja com sucesso ou falha. Muitas vezes o próprio objeto é capaz de &#8220;se matar&#8221; sozinho e isso é muito útil, tirando um pouco do trabalho do gerenciador, mas não o controle.</p>
<h4>Before starting</h4>
<p ALIGN="justify">Eu não tenho a pretensão que esse simples post cubra todos os recursos do QT ou todos os aspectos do gerenciamento de interfaces. Eu apenas vou falar de como EU resolvi um problema pelo qual eu passei. Esse post também é uma homenagem a um amigo paulista-carioca que já teve que descascar um abacaxi desses!</p>
<h4>Mão na massa</h4>
<p ALIGN="justify">Eu sou, na maioria das vezes, um programador bottom-up, porém um analista top-down. Isso pode parecer confuso, mas não há razão para pânico, ou quase&#8230;</p>
<p ALIGN="justify">Os objetos precisam trocar mensagens. Para isso o sistema de sinal-slot do QT vai ser de grande ajuda. Os objetos vão mandar sinais ( emit(signal) ) e o gerenciador vai escutá-los ( slots() ).</p>
<p ALIGN="justify">Por incrível que pareça, o construtor do gerenciador, daqui pra frente chamado de UIM, não possui uma linha de código sequer. Ele apenas inicializa os ponteiro com 0, apenas por paranóia (ou não)&#8230;</p>
<p ALIGN="justify">O UIM implementa slots para criação dos objetos e limpeza da bagunça. Ao criar um objeto, o UIM conecta esse objeto ao seu respectivo slot de limpeza. Quando o objeto morre, ele ativa o slot de limpeza no UIM. Os slots de criação serão ligados aos menus do objeto gráfico principal, neste exemplo, uma janela.</p>
<p ALIGN="justify">Os outros objetos são janelas menores, dialogs, sendo um para configuração do aplicativo, e dois pra falar de si mesmo (about), afinal, marketing é importante&#8230;</p>
<p ALIGN="justify">Todos os objetos gráficos eu cliquei e arrastei no Qt Designer e depois ajustei pra ficar do meu jeito. Nada de ficar alinhando pixel na mão, afinal não é uma obra de arte, é só uma prova de conceito.</p>
<h4>Os Objetos Gráficos</h4>
<p ALIGN="justify">A tela de configuração é um diálogo comum com um combo-box onde está uma lista de parâmetros a serem passados para o widget principal. Os detalhes que eu acrescentei ao código gerado pelo Qt Designer foram um destrutor, e um par sinal-slot para enviar os dados selecionados de volta para o gerenciador. Eu não me preocupei em guardar o estado da configuração atual. Isso é papo pra outro post.</p>
<p ALIGN="justify">Os abouts ficaram basicamente com o mesmo código, acrescidos de destrutores.</p>
<p ALIGN="justify">A janela principal, possui um menu que chama as outras janelas e um widget maluco cheio de quadrados que ficam piscando. A quantidade de quadrados é a informação que será alterada pela janela de configuração.</p>
<h4>The Magic QT</h4>
<p ALIGN="justify">Todos o objetos gráficos utilizados, são também QWidgets, pois suas classes herdam da classe QWidget, e eu utilizo em cada construtor o seguinte método herdado:</p>
<p ALIGN="justify">

<div class="wp_syntax"><div class="code"><pre class="qt" style="font-family:monospace;">this-&gt;setAttribute( Qt::WA_DeleteOnClose , true );</pre></div></div>

</p>
<p ALIGN="justify">De acordo com a <a CLASS="snap_shots" HREF="http://doc.trolltech.com/4.3/qcloseevent.html#details">documentação on-line</a>, isto diz para o QT que ele deve deletar o widget quando ele for fechado. Do contrário, ele será apenas escondido.</p>
<blockquote>
<p ALIGN="justify"><em>&#8220;&#8230;When a widget accepts the close event, it is hidden&#8230;&#8221;</em></p>
<p ALIGN="justify"><em>&#8220;&#8230;If you want the widget to be deleted when it is closed, create it with the Qt::WA_DeleteOnClose flag. This is very useful for independent top-level windows in a multi-window application&#8230;&#8221;</em></p>
</blockquote>
<p ALIGN="justify">As rotinas que fazem os objetos terminarem com falha, como clicar em Cancelar ou Fechar, estão diretamente conectadas aos seus próprios slots close(). Isso dispara uma série de eventos que culminam com a destruição do objeto.</p>
<p ALIGN="justify">As rotinas que fazem o objeto terminar com sucesso, como clicar em ok e enviar os dados, foram direcionadas a voltar para o UIM, para que ele possa roteá-las. Depois de pegar os dados, o UIM chama diretamente o slot close do objeto().</p>
<p ALIGN="justify">Quando um objeto é destruído, ele emite seu último suspiro, digo, sinal que é o destroyed(). Literalmente ele grita &#8220;FUI!!!&#8221;.</p>
<p ALIGN="justify">Do &#8220;lado de fora&#8221; do objeto, o UIM está ouvindo, conectando este sinal à rotina de limpeza, e TADÃM!!!! prontinho.</p>
<p ALIGN="justify">No exemplo que eu usei, a quantidade de quadrados na tela chega de um objeto MyConf, passa pelo UIM e é roteada para a MyApplication. Esta por sua vez, repassa para o widget maluco interno.</p>
<p ALIGN="justify">Pra ficar ainda mais interessante, enquanto uma janela menor está aberta, o widget pára de piscar, retornando quando a janelinha for fechada. Parece bobo, mas isso foi só pra mostrar que o UIM tem controle total sobreo o que acontece em cada janela, estando ela em foco, ou não.</p>
<h4>Conclusão</h4>
<p ALIGN="justify">O framework QT é imenso e fornece uma gama enorme funcionalidades. Uma delas é poder controlar como os objetos são destruídos. Utilizando isso junto com um pouco de planejamento e aliado ao sistema de sinal-slot podemos construir uma interface bastante complexa, sem transformá-la num <a CLASS="snap_shots" HREF="http://www.wizards.com/default.asp?x=dnd/eo/20051109a">Tarrasque</a> na hora de dar manutenção.</p>
<p ALIGN="justify">Fonte:</p>
<p><a CLASS="snap_shots" HREF="http://doc.trolltech.com">http://doc.trolltech.com</a></p>
<p ALIGN="justify">P.S.: O Código fonte completo do exemplo encontra-se sob a GPL e pode ser baixado por este <a HREF="http://src.blabos.org/blog/posts/12/uim.zip">link</a>. Um dia eu ponho comentários nele&#8230;</p>
<h4>BUGFIX</h4>
<p ALIGN="justify">O infeliz do inseto se escondia na falta de inicialização de propriedades no construtor da classe MySquares. O bichinho, apesar de pequeno era venenoso, visto que causava uma &#8216;Segmentation Fault&#8217;. Ao iniciar o programa, se eu fosse em qualquer about e o fechasse, isso disparava uma sequência de eventos que partia do pressuposto que a tela já estava devidamente configurada. O código corrigido encontra-se no link acima, e lembre-se:</p>
<p ALIGN="justify"><em>&#8220;Sempre inicialize suas variáveis&#8221;</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2008/01/construindo-um-gerenciador-de-interface-simples-para-sistemas-multi-janelas-com-qt/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
