<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>.::Escovando Bits::. &#187; qt</title>
	<atom:link href="http://escovandobits.wordpress.com/tag/qt/feed/" rel="self" type="application/rss+xml" />
	<link>http://escovandobits.wordpress.com</link>
	<description>Programação, Linux, tecnologia da informação, dicas, artigos</description>
	<lastBuildDate>Sun, 05 Jul 2009 15:42:47 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='escovandobits.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/ac8d2c79730f1bc1a6ebab006a3670da?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>.::Escovando Bits::. &#187; qt</title>
		<link>http://escovandobits.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://escovandobits.wordpress.com/osd.xml" title=".::Escovando Bits::." />
		<item>
		<title>Timer no PyQT</title>
		<link>http://escovandobits.wordpress.com/2009/03/27/timer_pyqt/</link>
		<comments>http://escovandobits.wordpress.com/2009/03/27/timer_pyqt/#comments</comments>
		<pubDate>Fri, 27 Mar 2009 16:48:42 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[pyqt]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[qt]]></category>
		<category><![CDATA[threads]]></category>

		<guid isPermaLink="false">http://escovandobits.wordpress.com/?p=305</guid>
		<description><![CDATA[Quem programa em Python provavelmente já precisou fazer alguma coisa com threads. Contudo quando estamos trabalhando com PyQT há alguns incovenientes em utilizar as threads da API do Python, principalmente quando temos interfaces gráficas. Recentemente tive problemas para fazer uma função que executasse determinada ação após um tempo pré-definido em segundos. Pois quando enquanto a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=305&subd=escovandobits&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;">Quem programa em Python provavelmente já precisou fazer alguma coisa com <a title="Python Threading" href="http://docs.python.org/library/threading.html" target="_blank">threads</a>. Contudo quando estamos trabalhando com PyQT há alguns incovenientes em utilizar as threads da API do Python, principalmente quando temos interfaces gráficas. Recentemente tive problemas para fazer uma função que executasse determinada ação após um tempo pré-definido em segundos. Pois quando enquanto a thread não terminasse sua execução a janela gráfica não aparecia.  Encontrei duas maneiras para solucionar,  a primeira utilizando <a href="http://doc.trolltech.com/4.4/qthread.html" target="_blank">QThread</a> e uma muito mais simples usando <a href="http://doc.trolltech.com/4.4/qtimer.html" target="_blank">QTimer</a>,  fica o registro das duas maneiras:</p>
<p style="text-align:justify;"><span id="more-305"></span></p>
<pre><span style="color:#ff80e0;">from</span><span style="color:#141312;"> PyQt4 </span><span style="color:#ff80e0;">import</span><span style="color:#141312;"> *</span>
<span style="color:#ff80e0;">from</span><span style="color:#141312;"> PyQt4.QtCore </span><span style="color:#ff80e0;">import</span><span style="color:#141312;"> *</span>

<span style="color:#141312;"><strong>class</strong> MyTimer(QThread):</span>
<span style="color:#141312;">	<strong>def</strong> </span><span style="color:#000e52;"><strong>__init__</strong></span><span style="color:#141312;">(</span><span style="color:#006e28;">self</span><span style="color:#141312;">,parent = </span><span style="color:#006e28;">None</span><span style="color:#141312;">):</span>
<span style="color:#141312;">		QThread.</span><span style="color:#000e52;"><strong>__init__</strong></span><span style="color:#141312;">(</span><span style="color:#006e28;">self</span><span style="color:#141312;">,parent)</span>

<span style="color:#141312;">	<strong>def</strong> run(</span><span style="color:#006e28;">self</span><span style="color:#141312;">):</span>
<span style="color:#141312;">		<strong>while</strong> </span><span style="color:#b08000;">1</span><span style="color:#141312;">:</span>
<span style="color:#141312;">		</span><span style="color:#888786;"><em># a cada 'self.tempo' segundos o sinal é emitido e
                  nós tratamos na outra classe. Exemplo</em></span>:
<span style="color:#141312;">			</span><span style="color:#006e28;">self</span><span style="color:#141312;">.<strong>emit</strong>(</span><span style="color:#0095ff;"><strong>SIGNAL</strong></span><span style="color:#141312;">(</span><span style="color:#bf0303;">"sinal_atualiza()"</span><span style="color:#141312;">))</span>
<span style="color:#141312;">			</span><span style="color:#006e28;">self</span><span style="color:#141312;">.sleep(</span><span style="color:#006e28;">self</span><span style="color:#141312;">.tempo)</span>

<span style="color:#141312;">	<strong>def</strong> Timer(</span><span style="color:#006e28;">self</span><span style="color:#141312;">,t=</span><span style="color:#b08000;">5</span><span style="color:#141312;">):</span>
<span style="color:#141312;">		</span><span style="color:#006e28;">self</span><span style="color:#141312;">.tempo = t</span>
<span style="color:#141312;">		</span><span style="color:#006e28;">self</span><span style="color:#141312;">.start()

</span></pre>
<p style="text-align:justify;"><span style="color:#141312;">Depois, na sua classe basta que gerencia a interface gráfica, basta instanciar o objeto e tratar os sinais definidos em MyTimer(), você pode definir quantos sinais forem necessários:</span></p>
<pre><span style="color:#141312;">	  </span><span style="color:#006e28;">self</span><span style="color:#141312;">.timer = MyTimer()</span>
<span style="color:#141312;">	  </span><span style="color:#006e28;">self</span><span style="color:#141312;">.timer.Timer(3)</span> <span style="color:#888786;"><em><em># 3 segundos

</em></em></span><span style="color:#141312;">	  </span><span style="color:#006e28;">self</span><span style="color:#141312;">.</span><span style="color:#0095ff;"><strong>connect</strong></span><span style="color:#141312;">(</span><span style="color:#006e28;">self</span><span style="color:#141312;">.timer,
                       QtCore.</span><span style="color:#0095ff;"><strong>SIGNAL</strong></span><span style="color:#141312;">(</span><span style="color:#bf0303;">"sinal_stualiza()"</span><span style="color:#141312;">),
                       </span><span style="color:#006e28;">self</span><span style="color:#141312;">.atualiza)</span>
<span style="color:#141312;">	  </span><span style="color:#888786;"><em># caso seja necessario executar algo após o termino da
          # therad (não é o caso </em></span><span style="color:#888786;"><em>do exemplo acima que o while
          # "trava" na função run()</em></span>
<span style="color:#141312;">	  </span><span style="color:#006e28;">self</span><span style="color:#141312;">.</span><span style="color:#0095ff;"><strong>connect</strong></span><span style="color:#141312;">(</span><span style="color:#006e28;">self</span><span style="color:#141312;">.timer,
                       QtCore.</span><span style="color:#0095ff;"><strong>SIGNAL</strong></span><span style="color:#141312;">(</span><span style="color:#bf0303;">"finished()"</span><span style="color:#141312;">),
                       </span><span style="color:#006e28;">self</span><span style="color:#141312;">.finaliza)</span></pre>
<p>Contudo existe uma maneira <strong>muito</strong> mais fácil de fazer um timer utilizando PyQT, usando a <a href="http://doc.trolltech.com/4.4/qtimer.html" target="_blank">QTimer</a></p>
<pre><span style="color:#141312;">	</span><span style="color:#006e28;">self</span><span style="color:#141312;">.timer = QtCore.QTimer()

</span><span style="color:#141312;">	</span><span style="color:#006e28;">self</span><span style="color:#141312;">.</span><span style="color:#0095ff;"><strong>connect</strong></span><span style="color:#141312;">(</span><span style="color:#006e28;">self</span><span style="color:#141312;">.timer,
                     QtCore.</span><span style="color:#0095ff;"><strong>SIGNAL</strong></span><span style="color:#141312;">(</span><span style="color:#bf0303;">"timeout()"</span><span style="color:#141312;">),
                     </span><span style="color:#006e28;">self</span><span style="color:#141312;">.atualiza)</span>

       <span style="color:#141312;"> </span><span style="color:#006e28;">self</span><span style="color:#141312;">.timer.start(</span><span style="color:#b08000;">3000</span><span style="color:#141312;">)</span> <span style="color:#888786;"><em># tempo em milisegundos</em></span></pre>
Posted in programação, pyqt Tagged: pyqt, python, qt, threads <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/escovandobits.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/escovandobits.wordpress.com/305/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/escovandobits.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/escovandobits.wordpress.com/305/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/escovandobits.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/escovandobits.wordpress.com/305/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/escovandobits.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/escovandobits.wordpress.com/305/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/escovandobits.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/escovandobits.wordpress.com/305/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=305&subd=escovandobits&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://escovandobits.wordpress.com/2009/03/27/timer_pyqt/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f615d34c675bc325d78631c8077f0187?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago Maluta</media:title>
		</media:content>
	</item>
		<item>
		<title>QModInfo &#8211; obtendo informações da /proc/modules</title>
		<link>http://escovandobits.wordpress.com/2008/09/28/qmodinfo-obtendo-informacoes-da-procmodules/</link>
		<comments>http://escovandobits.wordpress.com/2008/09/28/qmodinfo-obtendo-informacoes-da-procmodules/#comments</comments>
		<pubDate>Sun, 28 Sep 2008 18:00:19 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[modulos]]></category>
		<category><![CDATA[qt]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://escovandobits.wordpress.com/?p=208</guid>
		<description><![CDATA[A instalação do Ubuntu no meu notebook carrega 115 módulos! Sinceramente acho um exagero. Resolvi dar uma olhada mais detalhada nesses módulos e para facilitar minha vida fiz um programa gráfico (Qt 4.3) para listá-los.
Para acessar rapidamente, via terminal, digite:
git clone git://github.com/maluta/qmodinfo.git
Caso não tenha o git instalado, acesse o endereço abaixo e clique em download [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=208&subd=escovandobits&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><div class="mceTemp mceIEcenter" style="text-align:justify;">A instalação do Ubuntu no meu notebook carrega 115 módulos! Sinceramente acho um exagero. Resolvi dar uma olhada mais detalhada nesses módulos e para facilitar minha vida fiz um programa gráfico (Qt 4.3) para listá-los.</div>
<div id="attachment_207" class="wp-caption aligncenter" style="width: 414px"><a href="http://escovandobits.files.wordpress.com/2008/09/qmodinfo.png"><img class="size-full wp-image-207" title="qmodinfo" src="http://escovandobits.files.wordpress.com/2008/09/qmodinfo.png?w=404&#038;h=257" alt="QModInfo" width="404" height="257" /></a><p class="wp-caption-text">Listando informações sobre os módulos carregados</p></div>
<p>Para acessar rapidamente, via terminal, digite:</p>
<p style="text-align:center;">git clone git://github.com/maluta/qmodinfo.git</p>
<p style="text-align:justify;">Caso não tenha o <a href="http://git.or.cz/" target="_blank">git</a> instalado, acesse o endereço abaixo e clique em <strong>download</strong> para o <em>tarball</em> ou <em>zip</em>.</p>
<p style="text-align:center;"><a href="http://github.com/maluta/qmodinfo/tree/master" target="_blank">http://github.com/maluta/qmodinfo/tree/master</a></p>
Posted in Linux Tagged: Linux, modulos, qt, ubuntu <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/escovandobits.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/escovandobits.wordpress.com/208/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/escovandobits.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/escovandobits.wordpress.com/208/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/escovandobits.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/escovandobits.wordpress.com/208/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/escovandobits.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/escovandobits.wordpress.com/208/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/escovandobits.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/escovandobits.wordpress.com/208/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=208&subd=escovandobits&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://escovandobits.wordpress.com/2008/09/28/qmodinfo-obtendo-informacoes-da-procmodules/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f615d34c675bc325d78631c8077f0187?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago Maluta</media:title>
		</media:content>

		<media:content url="http://escovandobits.files.wordpress.com/2008/09/qmodinfo.png" medium="image">
			<media:title type="html">qmodinfo</media:title>
		</media:content>
	</item>
		<item>
		<title>Dicas de PyQt4</title>
		<link>http://escovandobits.wordpress.com/2008/02/08/dicas-de-pyqt4/</link>
		<comments>http://escovandobits.wordpress.com/2008/02/08/dicas-de-pyqt4/#comments</comments>
		<pubDate>Fri, 08 Feb 2008 04:36:08 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[pyqt]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[qt]]></category>

		<guid isPermaLink="false">http://escovandobits.wordpress.com/?p=37</guid>
		<description><![CDATA[Esse post irá apresentar alguns processos de desenvolvimento utilizando PyQt através da construção de um aplicativo simples e sua evolução.  Algumas dicas como utilizar o designer para fazer as telas e layouts e integrá-lo no seu código-fonte, o casamento com expressões regulares, sinais,  widgets gráficos (lineEdits, labels, comboBox, etc), arquivos, processos, strings&#8230;
 

Todo [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=37&subd=escovandobits&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p align="justify">Esse <i>post </i>irá apresentar alguns processos de desenvolvimento utilizando PyQt através da construção de um aplicativo simples e sua evolução.  Algumas dicas como utilizar o <i>designer</i> para fazer as telas e layouts e integrá-lo no seu código-fonte, o casamento com expressões regulares, sinais,  widgets gráficos (<i>lineEdits</i>, <i>labels</i>, <i>comboBox</i>, etc), arquivos, processos, strings&#8230;</p>
<p align="center"><img src="http://www.python.org/images/python-logo.gif" height="71" width="211" /> <a href="http://escovandobits.files.wordpress.com/2008/02/qt.gif" title="qt.gif"><img src="http://escovandobits.files.wordpress.com/2008/02/qt.gif" alt="qt.gif" /></a></p>
<p><span id="more-37"></span></p>
<p align="justify">Todo programa começa com uma idéia, certo? A idéia que eu tive para esse exemplo foi a utilização das variáveis globais no Linux e em especial a distribuição Gentoo, que utilizo no meu <i>desktop</i>. Procurando na <a href="http://www.gentoo.org/doc/en/handbook/handbook-x86.xml?part=2&amp;chap=5" target="_blank">documentação</a> encontrei a informação necessária, da qual eu traduzi a definição:</p>
<p><b>O que é uma variável de ambiente? </b></p>
<p align="justify"><i>Um variável de ambiente contém informações usadas por uma ou mais aplicações. Muitos usuários (e especialmente aqueles novos no Linux) tem dificuldade em na sua configuração e utilização. Contudo, aprender a usar os conceitos básicos das variáveis de ambiente pode facilitar a vida em muitos casos, principalmente na mudança de configurações de programas.</i></p>
<p><i><b>Primeira idéia:</b></i></p>
<p><i><b>Fazer um programa para ver  as variáveis de ambiente citadas</b> </i></p>
<p align="justify">O tutorial cita as seguintes variáveis globais: <b>PATH</b>, <b>ROOTPATH</b>, <b>LDPATH</b>, <b>MANPATH</b>, <b>INFODIR</b>, <b>PAGER</b>, <b>KDEDIRS</b>, <b>CONFIG_PROTECT</b>, <b>CONFIG_PROTECT_MASK, </b><b>EDITOR</b>.  A idéia foi fazer um programa gráfico para facilitar ao usuário iniciante entender o que significa as variáveis no seu sistema. Então o programa, inicialmente deverá:</p>
<blockquote><p>1. Mostrar as variáveis globais mais utilizadas</p></blockquote>
<p align="center"><img src="http://farm3.static.flickr.com/2117/2248295698_9ecf939efd_o_d.png" height="389" width="482" /></p>
<blockquote><p>2. Apresentar o significado de cada variável quando o usuário passasse o cursor do mouse em cima da palavra.</p></blockquote>
<div style="text-align:center;"><img src="http://farm3.static.flickr.com/2337/2249186363_768a77fabf_o_d.png" height="47" width="500" /></div>
<p align="justify">&nbsp;</p>
<p align="justify">Para facilitar a vida, todos as telas serão feitas no <i>Qt Designer</i>, pois é mais fácil criá-las e arrumar o <i>layout</i>. A receita é bem simples, vamos imaginar que seu arquivo (<i>widget</i>, <i>dialog</i>, etc) no <i>designer</i> chame <b>form.ui</b>. Utilizaremos o utilitário <b>pyuic4</b> para convertê-lo em código Python.</p>
<blockquote><p>#&gt; pyuic4 form.ui -o ui_form.py</p></blockquote>
<p>O começo do arquivo ficará semelhante a este:</p>
<pre class="brush: python;">

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'form.ui'
#
# Created: Sun Feb 8 15:35:23 2008
#      by: PyQt4 UI code generator 4.3.1
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

class Ui_Tela(object):
def setupUi(self, Tela):
Tela.setObjectName(&quot;Tela&quot;)
</pre>
<p align="justify">Depois, no código-fonte, iremos importar (ou herdar) a classe <b>Ui_Tela </b>onde Tela é um nome qualquer que eu escolhi. Nos outros exemplos chamarei o <i>widget</i> de form, logo a classe será Ui_Form.</p>
<pre class="brush: python;">

import sys, re, os, string
from PyQt4 import QtCore, QtGui
from ui_form import Ui_Tela

class QEnvApp(QtGui.QDialog,Ui_Tela):
def __init__(self):
QtGui.QDialog.__init__(self)
self.setupUi(self)

# O CÓDIGO-FONTE AQUI

if __name__ == '__main__':

app = QtGui.QApplication(sys.argv)
dialog = QEnvApp()
dialog.show()
sys.exit(app.exec_())
</pre>
<p align="justify">Podemos pensar a primeira maneira de fazer isso com comandos já conhecidos do bash como: echo $NOME_DA_VARIÁVEL</p>
<pre class="brush: python;">

def getEnv(self):

self.pathEdit.setText((os.popen(&quot;echo $PATH&quot;)).readline())
self.rootpathEdit.setText((os.popen(&quot;echo $ROOTPATH&quot;)).readline())
self.ldpathEdit.setText((os.popen(&quot;echo $LD_PATH&quot;)).readline())
</pre>
<p>Ou então, fazer de uma maneira mais portável:</p>
<pre class="brush: python;">

def getEnv(self):

self.pathEdit.setText(os.environ['PATH'])
self.rootpathEdit.setText(os.environ['ROOTPATH'])
self.ldpathEdit.setText(os.environ['LD_PATH'])
</pre>
<p><b>Segunda Idéia</b></p>
<p><b>Mostrar TODAS as variáveis do sistema</b></p>
<p align="justify">Da primeira idéia surgiram dois incovenientes, primeiro que o texto contido nas variáveis excedia o tamanho da área reservada, e segundo que não mostrava TODAS as variáveis de ambiente setadas. Como são muitas variáveis, achei melhor organizá-las em uma <a href="http://doc.trolltech.com/4.3.0/qcombobox.html">comboBox</a> e utilizar uma <a href="http://doc.trolltech.com/4.3.0/qtextedit.html">caixa de texto</a>.</p>
<p align="center"><img src="http://farm3.static.flickr.com/2015/2249500914_eb6485a1f9_o_d.png" height="117" width="482" /></p>
<p align="justify">Dois detalhes são interessantes, a primeira é referente a maneira de filtrar o nome das variáveis, abaixo a função que pega a saída do comando <i><a href="http://www.ss64.com/bash/export.html">export</a></i><i> </i>e através do filtro de uma expressão regular obtém os nomes das variáveis:</p>
<pre class="brush: python;">

def getEnvNames(self):
p = os.popen(&quot;export&quot;)
while 1:
line = QtCore.QString(p.readline())
if not line: break
sline = line.split(QtCore.QRegExp(&quot;[^A-Z_]+&quot;))
self.comboBox.insertItem(0,sline[1])
</pre>
<p align="justify">Também podemos escrever o código acima de uma maneira mais elegante, tornado-o mais portável, suponha que você rode seu <i>script </i>no Windows:</p>
<pre class="brush: python;">

def getEnvNames(self):
for param in os.environ.keys():
self.comboBox.insertItem(0,param)
</pre>
<p align="justify">O outro detalhe,  para evitar erros como &#8220;<i>TypeError: popen() argument 1 must be string, not QString&#8221; </i>é necessário fazer uma conversão do tipo <a href="http://doc.trolltech.com/4.3.0/qstring.html" target="_blank">QString</a> para o tipo <a href="http://docs.python.org/lib/string-methods.html" target="_blank">string</a>. Escolhi converter utilizando o <i>codec</i> <i>unicode_escape </i>pois transforma a string em um formato compatível com o código-fonte, entretanto há uma <a href="http://docs.python.org/lib/standard-encodings.html" target="_blank">lista</a> de <i>codecs</i> disponíveis.</p>
<pre class="brush: python;">

def showEnv(self, _index):

var =  unicode(self.comboBox.currentText(), 'unicode_escape')
p = os.popen( &quot;echo $&quot; + var )
self.textEdit.setText(p.readline())
</pre>
<p><b>Terceira Idéia</b></p>
<p><b>Um pouco de interação&#8230;</b></p>
<p align="justify">Até o momento o programa não dá possibilidade ao usuário de alterar e gravar o conteúdo de alguma variável, iremos fazer isso:</p>
<p align="center"><img src="http://farm3.static.flickr.com/2077/2249711644_c207269ee4_o.png" height="296" width="376" /></p>
<p align="left">Lembrando de estabelecer as conexões dos <i>widgets</i>:</p>
<p align="left">
<pre class="brush: python;">
def makeconnections(self):
self.connect(self.comboBox, QtCore.SIGNAL('activated(int)'), self.showEnv)
self.connect(self.salvarButton, QtCore.SIGNAL('clicked()'), self.salvar )
self.connect(self.salvarpermanenteButton, QtCore.SIGNAL('clicked()'), self.salvarPermanentemente )
</pre>
<p>O botão <b>Salvar </b>grava<b> </b>o  conteúdo na variável no ambiente de execução  do programa, portanto se você fechar o programa e ver o estado da variável verá que nada foi alterado.  Para ver o resultado, descomente, na função <i>salvar</i> do script as seguintes linhas:</p>
<pre class="brush: python;">

#for param in os.environ.keys():
#print &quot;%20s %s&quot; % (param,os.environ[param])
</pre>
<p align="justify">Já o botão <b>Salvar Permanentemente</b> grava o conteúdo no arquivo <b>~/.</b><b>bashrc</b>, para que todas as novas instâncias mantenham o conteúdo alterado. Será salvo no final do arquivo.</p>
<pre class="brush: python;">

def salvarPermanentemente(self):

path = os.environ['HOME'] + &quot;/.bashrc&quot;

var = unicode(self.comboBox.currentText(), 'unicode_escape')

value = unicode(self.textEdit.toPlainText(), 'unicode_escape')

f=file(path, 'a')
f.write(&quot;export &quot; + var + &quot;=&quot; + value )
f.close()
</pre>
<p align="center">Os três exemplos estão no arquivo abaixo</p>
<p align="center"><b>*** <a href="http://br.geocities.com/maluta_tiago/blog/escovandobits/qenv/qenv.tar.gz" target="_blank">Download (tar.gz)</a> ***</b></p>
<p><b>Conclusão</b></p>
<p align="justify">Acredito que um principais objetivos das linguagens interpretadas é proporcionar a construção de aplicativos de forma mais rápida  se comparado com outras linguagens como Java ou C++. Pode-se desenvolver desde pequenos utilitários até automatizar grandes processos: como <i>backup</i>, configuração, comunicação, interfaces, <i>front-ends</i>; tudo aliado a vantagem da independência em relação ao Sistema Operacional  (exceto em casos específicos, como editar o arquivo .bashrc). Alguns exemplos de projetos,  como o <a href="http://handhelds.org/~pfalcon/gsoc/" target="_blank">PyQemu </a> &#8211; uma interface em Python para o Qemu &#8211; refletem as possibilidades da linguagem e sua utilização nos mais diversos segmentos.</p>
<p>Referências:</p>
<p><a href="http://docs.python.org/lib/lib.html" target="_blank">http://docs.python.org/lib/lib.html </a></p>
<p><a href="http://wiki.python.org/moin/PyQt4" target="_blank">http://wiki.python.org/moin/PyQt4</a></p>
<p><a href="http://www.diotavelli.net/PyQtWiki" target="_blank">http://www.diotavelli.net/PyQtWiki </a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/escovandobits.wordpress.com/37/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/escovandobits.wordpress.com/37/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/escovandobits.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/escovandobits.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/escovandobits.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/escovandobits.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/escovandobits.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/escovandobits.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/escovandobits.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/escovandobits.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/escovandobits.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/escovandobits.wordpress.com/37/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=37&subd=escovandobits&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://escovandobits.wordpress.com/2008/02/08/dicas-de-pyqt4/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f615d34c675bc325d78631c8077f0187?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago Maluta</media:title>
		</media:content>

		<media:content url="http://www.python.org/images/python-logo.gif" medium="image" />

		<media:content url="http://escovandobits.files.wordpress.com/2008/02/qt.gif" medium="image">
			<media:title type="html">qt.gif</media:title>
		</media:content>

		<media:content url="http://farm3.static.flickr.com/2117/2248295698_9ecf939efd_o_d.png" medium="image" />

		<media:content url="http://farm3.static.flickr.com/2337/2249186363_768a77fabf_o_d.png" medium="image" />

		<media:content url="http://farm3.static.flickr.com/2015/2249500914_eb6485a1f9_o_d.png" medium="image" />

		<media:content url="http://farm3.static.flickr.com/2077/2249711644_c207269ee4_o.png" medium="image" />
	</item>
	</channel>
</rss>