Python QT
Aprenda mais sobre a combinação de uma das mais poderosas linguagens com um dos melhores toolkits gráficos
O Python é uma linguagem de programação poderosa e fácil de aprender. Há algum tempo a febre do Python deu a impressão de que a linguagem era um tipo de XML, ou seja, mais uma solução para todos os problemas da humanidade que aparecem a torto e a direito por aí nestes tempos. Em pouco tempo, porém, se viu que o Python era real.
Com características emprestadas de várias outras linguagens associadas a aspectos próprios bastante, digamos, característicos, o Python vem se firmando como a mais bem sucedida das linguagens interpretadas.
Uma das grandes vantagens do Python sobre outras linguagens semelhantes é a sua capacidade de permitir que a linguagem seja facilmente estendida com funções em C ou C++.
A Qt é um toolkit de desenvolvimento de aplicações em C++ multiplataforma. Para muitos, é considerado o melhor toolkit gráfico para qualquer plataforma, oferecendo, além da funcionalidade gráfica, funções de acesso a bancos de dados, rede, gerenciamento de arquivos, etc.
Surge então o PyQT, ou Python QT, que se propõe a unir a melhor linguagem e o melhor toolkit num só produto. Com o PyQT é possível utilizar Python para criar interfaces de aparência bem profissional com a Qt.
O primeiro passo é instalar o PyQT. A referência aos fontes pode ser encontrada no final do artigo. Os pacotes binários devem ser oferecidos pelas várias distribuições.
Este arquivo não se propõe a ensinar ninguém a usar Python, nem a usar Qt. Destina-se, sim, às pessoas que conhecem os dois e gostariam de trabalhar com PyQT. Os links para documentação de Python e Qt se encontram no final do artigo.
Hello world
Como de costume, a primeira coisa que se faz com uma nova linguagem de programação (ou novo toolkit neste caso) é criar o famoso programa “Hello world”.
#!/usr/bin/env python
import sys
from qt import *
a = QApplication(sys.argv)
hello = QPushButton(“Hello world!”,None)
hello.resize(100,30)
a.setMainWidget(hello)
hello.show()
a.exec_loop()
Quem conhece programação Qt vai, certamente, reconhecer este trecho, já que é muito semelhante à programação tradicional em C++. Este texto já pode dar uma boa idéia do quanto é parecida a programação Qt em Python e C++.
Sinais e Slots
O uso de sinais e slots em PyQT é uma tarefa bastante simples. É possível conectar sinais tanto para slots Qt quanto para métodos em uma classe Python.
Os sinais são identificados como sendo Qt ou Python usando-se SIGNAL() ou PYSIGNAL() respectivamente. Da mesma forma, os slots podem ser funções Python normais ou slots Qt (SLOT()). Veja algumas maneiras de se conectar um sinal a um slot:
QObject.connect(a,SIGNAL(“QtSig()”),funcaoPython)
QObject.connect(a,SIGNAL(“QtSig()”),classePython.metodoPython)
QObject.connect(a,SIGNAL(“QtSig()”),PYSIGNAL(“SinalPython”))
QObject.connect(a,SIGNAL(“QtSig()”),SLOT(“SlotQt()”))
QObject.connect(a,PYSIGNAL(“SinalPython”),funcaoPython)
QObject.connect(a,PYSIGNAL(“SinalPython”),classePython.metodoPython)
QObject.connect(a,PYSIGNAL(“SinalPython”),SIGNAL(“SinalQt()”))
QObject.connect(a,PYSIGNAL(“SinalPython”),SLOT(“SlotQt()”))
Sabendo isso, pode-se conectar um sinal e um slot para fazer o botão “Hello World” fechar o programinha anterior:
#!/usr/bin/env python
import sys
from qt import *
a = QApplication(sys.argv)
hello = QPushButton(“Hello world!”,None)
hello.resize(100,30)
hello.connect(hello,SIGNAL(“clicked()”),a,SLOT(“quit()”))
a.setMainWidget(hello)
hello.show()
a.exec_loop()
Assim, quando o botão hello for pressionado (sinal clicked ()), o slot quit() da aplicação será chamado.
Widgets personalizados
Tentando um exemplo ligeiramente mais complexo, podemos ver como criar um widget personalizado. O exemplo ainda ajuda a visualizar como as classes Qt são utilizadas exatamente como se fossem classes Python normais:
#!/usr/bin/env python
import sys
from qt import *
class WidgRevista(QVBox):
def __init__(self,parent=None,name=None):
QVBox.__init__(self,parent,name)
lcd = QLCDNumber(2,self,”lcd”)
slider = QSlider(Qt.Horizontal,self,”slider”)
slider.setRange(0,99)
slider.setValue(0)
self.connect(slider,SIGNAL(“valueChanged(int)”),lcd,SLOT(“display(int)”))
sair = QPushButton(“Sair”,self,”sair”)
self.connect(sair,SIGNAL(“clicked()”),qApp,SLOT(“quit()”))
a = QApplication(sys.argv)
w = WidgRevista()
a.setMainWidget(w)
w.show()
a.exec_loop()
QT Designer
Para quem está habituado a utilizar o fantástico Qt Designer para criar interfaces para Qt não tem com que se preocupar. O PyQT vem com um utilitário chamado pyuic, que faz as vezes do uic da Trolltech, só que gerando, claro, código Python.
Para gerar uma interface com o pyuic, salve a interface no QT Designer e use o compilador para gerar o arquivo Python:
pyuic rev4.ui > rev4.py
Onde rev4.ui é o arquivo do QT Designer e rev4.py, o arquivo onde o código Python será gerado. O código gerado contém uma classe representando o diálogo ou janela criada já com os métodos e conexões feitas no QT Designer prontas para serem utilizadas. A figura 2 mostra um diálogo feito em QT Designer sendo executado já como programa Python.
Módulos
Até agora usamos apenas o módulo “principal” (qt) do PyQT, que é o que mais será usado pelo programador, mas a implementação do Python QT é dividida em vários módulos:
• qt: módulo principal contendo os widgets e as classes “core”;
• qtcanvas: implementação das classes do módulo Canvas da Qt;
• qtgl: classes de OpenGL da Qt;
• qtnetwork: classes de acesso a rede;
• qtpe: classes usadas em palmtops com a Qt Embedded;
• qtsql: classes de acesso a bancos de dados;
• qttable: classes do módulo Table da Qt;
• qtxml: classes de tratamento de XML.
Para Saber Mais:
Documentação do Python - www.python.org/doc
Documentação da Qt - doc.trolltech.com
Download do PyQT - www.riverbankcomputing.co.uk/pyqt/download.php
Página do PyQT - www.riverbankcomputing.co.uk/pyqt/index.php
Roberto Teixeira - maragato@kde.org