quinta-feira, 23 de janeiro de 2014

Introdução ao PyQt

PyQt é um conjunto de bindings ou pontes de acessso à biblioteca Qt para Python.

Documentação 
A documentação do PyQt pode ser encontrada no site da sourceforge.net. Alguns dizem que a melhor documentação para o PyQt é a do próprio Qt, mas está voltada para C++ então você terá que interpretar. Uma outra alternativa é a documentação do PySide que é facilmente adaptada para PyQt. 

Além das API References, existe um vasto material espalhado na nuvem partindo de blogs e outros, já sabemos a quem consultar!

Licenças
Na verdade, as diferenças entre o o PyQt e o PySide são minimas, acho que o maior diferencial está no tipo de licença que oferecem. O PySide tem a LGPL que é totalmente free, o PyQt possui licença comercial e GPL. 

Na prática, se eu não estiver confundido algo, a LGPL permiter qualquer tipo de comercialização ou utilização para o seu aplicativo, com a GPL você pode distribuir cópias do programa ou modificá-lo mas não pode vende-lo ou torna o seu código secreto, neste caso você precisaria de uma licença comercial.  E para quem pensa que o Qt não é free, está enganado, o Qt possui as licenças GPL e LGPL.

Estrutura básica de comandos para iniciar uma aplicação usando PyQt
Se você está interessado em iniciar o desenvolvimento de aplicações com o PyQt, abaixo seguem os comandos essenciais para iniciar uma aplicação. 

Indo direto ao ponto, abra um editor de texto de sua preferência e digite a sequência de comandos abaixo ou copie e cole. A primeira opção é mais recomendada para quem deseja melhor assimilação dos comandos.


Abrindo uma Janela no PyQt.


Para abrirmos uma jánela poderiamos utilizar a classe QMainWindow ou a classe QDialog. A principal diferença entre elas é que a QMainWindow é um pouco mais completa porque já vem com opções direcionadas à criação de menus, toobar e status bars, por exemplo. Quanto mais simples for a aplicação não haverá problemas em utilizar uma ou outra. Contudo, por mais que a nossa aplicação se encaixar nos padrões da simplicidade, utilizaremos primeiro a classe QMainWindow e depois abriremos uma outra janela utilizando uma QDialog.








Modificando o tamanho de uma Janela

Para modificar manualmente o tamanho de uma window podemos utilizar o método setGeometry(), se a janela ocupar toda a tela podemos utilizar o método showMaximized() antes do comando self.show().


QtGui.QWidget.setGeometry



O médodo setGeometry() (linha 4) possui duas funções, uma determinar a posição da janela na tela e determinar o tamanho da janela.Os primeiros dois parâmetros correspondem às cordenadas x (coluna) e y (linha) da posição da janela . O terceiro e quarto parâmetro correspondem, respectivamete, à largura e altura da Janela. Altenativamente, ao invés de setGeometry(), poderiam ser utilizados os métodos resize() e move() ambos da classe QWidget.


QtGui.QWidget.showMaximized


O médodo showMaximized() (linha 4) faz a janela ocupar todo o tamanho da tela. Seria interessante ver como se comporta o método QWidget.showFullScreen(), já li em um post que a differença deste para o showMaximized() é que o primeiro esconde a tool bar mas não fiz o teste para certificar.


Clique aqui para conhecer mais métodos

Adicionado um QPushButton à UI 

Para adicionar widgets na window basta criar atributos e instanciá-los a partir da classe desejada, e informar alguns parâmetros se necessário.  No exemplo abaixo vamos utilizar a classe QPushButton e adicionar um botão à window.




Abstraindo elementos da UI
Criamos o método setupUi (linha 12) apenas para abstrair do construtor __init__ os elementos de interface gráfica da UI, e deixar o código, na visão de alguns, mais organizado.

Atributos de classes
Tratando-se ainda do widget QPushButton, poderiamos obter o mesmo resultado substituindo o codigo do método setupUi da seguinte forma.


A diferença é sútil, apenas definimos o atributo para self ao ivés de deniní-lo no próprio método. No primeiro exemplo o atributo button não está disponivel para acesso através de uma instância de MyApp(), enquanto que no segundo exemplo temos acesso às suas propriedadades pois button está disponível na instância. O abordagem a ser utilizada vai depender da sua necessidade de acesso às propriedades de um atributo fora do método em que foi criado.

Abrindo uma Janela secundária no PyQt
 

terça-feira, 14 de janeiro de 2014

VirutalBox: Como mudar o UUID de uma imagem .vdi no Ubuntu 13.10

Estava utilizando o Virtual Box e precisei criar duas máquinas virtuais com o sistema operacional Windows. Acontece que quando tentei criar a segunda máquina virtual apareceu a seguinte mensagem:


Failed to open the hard disk file /home/edytarcio/Utilities/VM (copy)/Win7.vdi.
Cannot register the hard disk '/home/edytarcio/Utilities/VM (copy)/Win7.vdi' {ffc2ef02-852e-46a9-8bd7-b3513bd6abb2} because a hard disk '/home/edytarcio/Utilities/VM/Win7.vdi' with UUID {ffc2ef02-852e-46a9-8bd7-b3513bd6abb2} already exists.
O problema aconteceu porque as imagens que eu estava utilizando possuiam o mesmo UUID; Eu tinha apenas duplicado a primeira imagem e renomeado.

Pois bem, depois de fazer uma pesquisa no google descobri a solução. No Ubuntu, apenas digite:

$ VBoxManage internalcommands sethduuid Win7.vdi /path/to/virtualdisk.vdi

UUID changed to: 24b203de-4388-4278-a510-594f8919aa80

Será gerado um novo UUID para a sua imagem .vdi.  
Observe que o caminho deve ser substituído pelo endereço da imagem, exemplo:

$ VBoxManage internalcommands sethduuid Win7.vdi