Arquivo da tag: qobject

PySide e aplicações web

Recentemente eu me vi obrigado a mudar a linha de desenvolvimento de um projeto meu, e pra isso eu resolvi abandonar muita coisa e me dedicar de fato ao Python. Eu sempre soube que a comunidade do Python era muito grande e bem entusiasmada, mas me surpreendi com o quanto eu consegui progredir em tão pouco tempo, tá dando tempo até de postar no blog e adiantar tempo no cronograma.

Enfim, minha situação é a seguinte: pretendo fazer um sistema web, com a interface inteira em HTML e um back-end qualquer (tá, eu vou escolher o Django, mas você que está lendo é livre para escolher qualquer outro), mas que o usuário final veja esse sistema como um software comum, com atalho na área de trabalho, janelinha dedicada e tudo mais. Até ai eu poderia usar um Adobe AIR da vida, mas o problema é que eu preciso me comunicar com alguns recursos do PC, tipo comandos no terminal, janela de autenticação, ou até mesmo um “visual” mais desktop. Então me surgiram diversas opções pra Mono, Python, e até o C++… Mas quem me agradou de verdade foi o PySide, uma binding oficial do Qt em Python.

O que me convenceu a gostar do PySide foi a facilidade de implementar instâncias derivadas de QObject dentro de um QWebView, essas instâncias ficam acessíveis no objeto window do JavaScript. Suponhamos que eu tenha uma classe mais ou menos assim:

from PySide import QtCore

class MyJSObject(QtCore.QObject):
    @QtCore.Slot()
    def teste(self):
         print "Hello from JavaScript"

Com essa classe criada, eu posso adicioná-la ao frame principal de um determinado QWebView da seguinte maneira:

	meuBrowser = QtWebKit.QWebView()
	meuBrowser.load(QtCore.QUrl('http://localhost/minhapagina.htm'))
	meuBrowser.page().mainFrame().addToJavaScriptWindowObject('myjs', MyJSObject())

Experimente fazer uma chamada no JavaScript ao objeto window[“myjs”].teste(), ou se você preferir injetar um código JavaScript para esse fim, também é possível através do evaluateJavaScript():

	meuBrowser.page().mainFrame().evaluateJavaScript('window["myjs"].teste()')

Agora é só conferir o terminal do Python pra você ver o print do método teste() funcionando. A partir desse conceito você tem uma gama de opções para desenvolver aplicações ricas usando todo potencial do Python e do que há de melhor na web ao mesmo tempo.

Não se esqueça de os métodos declarados dentro da sua classe derivada de QObject precisam do decorator Slot para ficarem visíveis no JavaScript. Para tirar mais dúvidas quanto as slots e aos signals, leia esse trecho da documentação oficial.

Dedico esse artigo ao pessoal do canal #python na rede vIRCio, em especial ao Rafaelzinhu por ter me indicado esse servidor IRC e ao vitorlobo com o blog Pythonando, que serviu de ótima referência pra que eu pudesse destrinchar bastante coisa sobre o PySide.

Fonte: TimoteoRamos