Como criar seu primeiro plugin para QGIS usando Python e Qt Designer? Parte I

Dê seus primeiros passos na criação de plugins com Python e QGIS utilizando o Qt Designer.

A automatização de tarefas auxilia enormemente vários profissionais. Já mostramos como a programação pode ajudar ao executar tarefas rotineiras em apenas algumas linhas de código (Veja a postagem sobre python clicando aqui).

Agora, vamos supor que você precise desenvolver uma interface gráfica para essa automatização, pois somente as linhas de programação não são suficiente. Para resolver este problema, vamos utilizar o Qt Designer.

Como vamos criar um plugin para o QGIS 2.18, lembre-se que este software já vem instalado junto com ele.

O que é o Qt Designer?

Em primeiro lugar, é importante definirmos o que é Qt.

O Qt é um programa multi-plataforma para desenvolvimento de interfaces gráficas para softwares. Desta forma, o Qt Designer é o programa que reúne todas essas ferramentas para nos auxiliar a desenvolver nosso plugin.

Interface gráfica do programa Qt Designer.
Interface gráfica do programa Qt Designer.

É interessante notar que softwares como QGIS, Google Earth e VLC Media Player foram desenvolvidos utilizando o Qt.

Primeiros passos para criar um plugin no QGIS

Obviamente, você terá que ter instalado o QGIS, o qual irá trazer junto, o Qt Designer, basta procurar no seu menu iniciar por “Qt” e você irá localizar esse programa.

É interessante também que você tenha um bom editor de textos. Normalmente, quando trabalhamos com programação, você irá encontrar a recomendação de uso do NotePad++, o qual também recomendamos o uso (clique aqui para baixá-lo).

Agora, vamos instalar alguns plugins que irão nos ajudar a criar um plugin no QGIS, quem indica o uso desses plugins é o Ujaval Gandhi no QGIS Tutorials and Tips – o qual indica que sejam instalados os seguintes plugins:

  • Plugin Builder: Este plugin cria todos os arquivos necessários para o desenvolvimento de novos plugins.
  • Plugin Reloader: Facilita na atualização das alterações do seu plugin. Sem ele, você terá que ficar reiniciando o QGIS para que as suas alterações sejam apresentadas.

Para instalar esses plugins, dentro do QGIS, vá em Plugins > Gerenciar e Instalar Plugins (Complementos) e procure pelos nomes citados acima (lembrando que para o Plugin Reloader aparecer, você precisará ativar a opção “Mostrar Plugins Experimentais” na mesma janela, na aba Opções).

Onde ativar os plugins experimentais no QGIS.
Onde ativar os plugins experimentais no QGIS.

Criando os arquivos necessários

Agora vamos começar a criar os arquivos que são necessários para desenvolver nosso plugin de QGIS.

Com o QGIS aberto (neste tutorial, estamos usando a versão 2.18), vá em plugins e acesse o Plugin Builder. Assim que a janela do Plugin Builder abrir, ela vai solicitar para você algumas informações relacionada ao nosso plugin:

  • Class Name: Indica o nome da classe do python com o código do nosso plugin (também será o nome da pasta contendo todos os dados do nosso plugin);
  • Plugin Name: Nome que irá aparecer no gerenciador de plugins do QGIS;
    Description: Descrição do nosso plugin;
  • Module Name: Este será o nome do arquivo principal de python;
  • Text for the menu item: Texto que os usuários irão utilizar para buscar o plugin;
  • Author/Company: Nome do autor ou da empresa desenvolvedora;
  • Email Address: Email para contato;
  • Menu: Indica em qual categoria nosso plugin irá ser encaixado no menu do QGIS.

Não esqueça de marcar a caixa indicando que o plugin é experimental.

Acrescentando dados ao Plugin Builder para nosso Plugin.
Acrescentando dados ao Plugin Builder para nosso Plugin.

Logo em seguida, ao clicar em Próximo (Next), será solicitado uma descrição mais detalhada do plugin. No nosso caso, iremos criar um plugin que irá receber as coordenadas fornecidas pelo usuário e irá criar um shapefile.

Não esqueça de marcar a caixa “Flag the plugin as experimental”.

Na última janela, você irá definir a pasta que será criado os arquivos do plugin, em seguida, clique em “Generate”. Para facilitar o processo de criação, já vamos salvar o plugin na pasta de plugins do QGIS, a qual localiza-se em “C:\Usuários\Nome do Usuário\.qgis2\python\plugins”.

Lembre-se que em “Nome do Usuário” irá aparecer o nome do usuário do seu computador.

Se tudo ocorrer corretamente, uma janela irá abrir confirmando a criação dos arquivos

Compilando os arquivos gerados

Antes de podermos utilizar nosso plugin, precisamos compilar os arquivos que acabamos de gerar. Para este procedimento, iremos utilizar o programa OSGeo4W Shell, o qual já vem instalado com o QGIS 2.18 – Busque por ele no seu menu iniciar ou na pasta do QGIS.

Terminal OSGeo4W com os comandos executados nesta postagem.
Terminal OSGeo4W com os comandos executados nesta postagem.

Para compilar os arquivos criados, basta utilizarmos o comando “cd” para navegarmos até a pasta onde o plugin esta salvo e em seguida, utilizar os comandos “pyrcc4” para compilar os arquivos.

Esse procedimento irá converter o arquivo resources.qrc, para o formato python (.py) (BritishSteel em GIS StackExchange).

Copie e cole os códigos abaixo no OSGeo4W Shell, realizando as devidas substituições na pasta onde esta salvo o seu plugin e no nome dos arquivos (caso você tenha utilizado um nome diferente do nosso).


cd C:\Users\ferna\.qgis2\python\plugins\pontoExato\
pyrcc4 -o resources.py resources.qrc

Após esse procedimento, reinicie o QGIS e o plugin irá aparecer na sua tela conforme a figura abaixo.

Plugin Vazio no QGIS.
Plugin Vazio no QGIS.

Note que agora sim, poderemos trabalhar na interface do nosso plugin no Qt Designer.

Trabalhando com Python e Qt Designer

Pelo menu iniciar, vá até a pasta do QGIS 2.18 e clique em “Qt Designer with QGIS 2.18.11 custom widgets”. Quando o programa abrir, uma janela será aberta solicitando se você quer abrir um arquivo novo ou abrir um existente – Clique em “Open” e procure pelo arquivo .ui na pasta do nosso plugin.

Arquivo a ser aberto no Qt Design.
Como abrir um arquivo a ser aberto no Qt Design.

Na janela esquerda (widget box) do Qt Designer, há várias opções para você complementar seu plugin. Aqui, vamos inserir textos (para indicar ao usuário como ele deve inserir as coordenadas) e um campo para receber essas coordenadas.

  • Texto: Procure no Widget Box por Display Widgets, em seguida, arraste para o nosso plugin o item Label (três vezes, uma para o campo longitude e outro para a latitude e o último para o número do sistema de projeção);
  • Campos para Coordenadas: No Widget Box, busque por Input Widgets e adicione três Line Edit ao nosso plugin, para que o usuário insira as coordenadas e a projeção.

Lembre-se de trocar os nomes de cada botão e caixa de texto no Object Inpector do Qt Designer, pois é a partir desses nomes que nós vamos vincular as ações no código Python.

Neste exemplo, a caixa de texto com a longitude é chamada de longTextIn, latitude é chamada de latTextIn, e a do número do sistema de projeção, projEPSG.

Aparência e nomes dos objetos criados no Qt Designer.
Aparência e nomes dos objetos criados no Qt Designer.

Após criar essa interface, vamos inserir alguns códigos em python no arquivo pontoExato.py (que encontra-se na pasta do nosso plugin) utilizando o NotePad++ para dizer ao computador como iremos manipular os dados fornecidos pelo usuário.

Primeiro, adicione QFileDialog à lista de importações no começo do arquivo (o resultado é o seguinte: “from PyQt4.QtGui import QAction, QIcon, QFileDialog”) e o qgis.core também (“from qgis.core import *”).

from PyQt4.QtCore import QSettings, QTranslator, qVersion, QCoreApplication
from PyQt4.QtGui import QAction, QIcon, QFileDialog # Adicione o QFileDialog aqui.
from qgis.core import * # Acrescente essa linha de código.
# Initialize Qt resources from file resources.py
import resources
# Import the code for the dialog
from ponto_exato_dialog import pontoExatoDialog
import os.path

Em seguida, vá até o final do código e procure pela função run (“def run(self)”), onde dentro da condição “if result:”, você terá que inserir o seguinte código:

# Variáveis que recebem as coordenadas fornecidas pelo usuário (e projeção)

longX = self.dlg.longTextIn.text()
latY = self.dlg.latTextIn.text()
projecao = self.dlg.projEPSG.text()

# Definindo a geometria do shapefile
camada = QgsVectorLayer('Point?crs=epsg:'+projecao, 'point' , 'memory')
			 
# Define o provedor os pontos fornecidos
prov = camada.dataProvider()
ponto = QgsPoint(float(longX),float(latY))
			 
# Adiciona uma nova feição para a geometria
feat = QgsFeature()
feat.setGeometry(QgsGeometry.fromPoint(ponto))
prov.addFeatures([feat])
		 
# Atualiza a camada
camada.updateExtents()
			 
# Adiciona a camada ao QGIS
QgsMapLayerRegistry.instance().addMapLayers([camada])

Ao adicionar esse código, salve o arquivo .py e abra o QGIS.

Com este novo plugin, você poderá adicionar pontos em locais específicos da sua área de estudo, lembrando sempre de conferir qual é o tipo de coordenada (geográfica decimal ou projetada) e qual é o datum dele.

Acompanhe o Blog 2 Engenheiros que em breve estaremos lançando a segunda parte deste tutorial, onde iremos incrementar as funcionalidades deste plugin.

Caso você tenha alguma dúvida ou ideia para melhorar este plugin, deixe ela nos comentários.

Referências consultadas:

“How To” In QGIS: https://howtoinqgis.wordpress.com/2016/10/23/how-to-create-a-memory-layer-from-the-python-console/

QGIS Plugin Builder: http://g-sherman.github.io/Qgis-Plugin-Builder/

StackOverFlow - QGIS: add polygon by inputting coordinates: https://stackoverflow.com/questions/43674650/qgis-add-polygon-by-inputting-coordinates

Ujaval Gandhi - QGIS Tutorials and Tips: https://www.qgistutorials.com/en/docs/building_a_python_plugin.html


Clique na figura abaixo e assine nossa lista de emails para receber nosso ebook "Como criar mapas de localização com ArcGIS 10.x".


Author: Fernando BS

Engenheiro Ambiental e de Segurança do Trabalho. Atua nas áreas de recuperação ambiental, geoprocessamento e ciência do solo. Busca soluções utilizando softwares como ArcGIS, R e MATLAB.

19 thoughts on “Como criar seu primeiro plugin para QGIS usando Python e Qt Designer? Parte I”

  1. Olá! Parabéns pelo tutorial, estou tentando descubrir no Qgis se existe a função de soma acumulativa, no Excel posso fazer, ou por interação programando, no Qgis existe essa soma acumulativa?

      1. Muitoo obrigado, juro que pensei que não iam responder, perdão por jugar.
        Sou graduando em Engelharia Cartográfica, estou com um projeto porem estou com umas dificuldades. Bom… tentei fazer um paliativo, meu objetivo na verdade é criar um plugin, afim que este plugin poderá identificar cada face do lote(edificação) ao passar o cursor e as demais informações existentes , como também gerar essa leitura e exportar, deixa eu te dar um exemplo:
        Tenho um arquivo em Shapefile(ou dwg mais isso poderei transformar tranquilo), de um loamento com diversas quadras e lotes(as edificações/casas), então este shap tem informações de areas, coordenadas, numero de lotes etc…, ai entra minha dificuldade, é que com essas informações eu gerar de forma automática a leitura das frentes das casas e somá-las a frente da casa atual mais a anterior( por isso que citei a soma acumulada no comentário anterior) e isso fecha minha pacela( onde tem as casas) esses valores que vou ter das frentes, vai ser minha nova coluna com as frentes de cada casa, e por fim exportar o shap com esses novos dados. Novamente muito obrigada pela atenção.

        1. Boa tarde Charlene,

          Deixa eu ver se eu entendi, você quer extrair os parâmetros como frente, lado dos lotes para salvar eles na tabela de atributos? Segue abaixo uma ideia:

          Você pode tentar algo assim para ter os valores da frente do lote: 1) Converter Polígonos em Linha (“qgis:polygonstolines”); 2) Separar as Linhas (“qgis:explodelines”); 3) Obter os tamanhos/medidas das linhas.

          Neste GIS StackExchange tem uma sugestão de código para isso: https://gis.stackexchange.com/questions/172533/pyqgis-polygon-to-lines-with-geometry-length-and-select-features-with-conditio

  2. Bom dia,

    Estou desenvolvendo um plugin para o Qgis com funcionalidades ligeiramente diferentes do vosso tutorial.

    Pretendo que o meu plugin insira texto (string) numa variável através da minha caixa de dialogo.

    Já encontrei alguns exemplos, mas nenhum funciona:

    “def getText(self):
    text, okPressed = QInputDialog.getText(self, “Get text”,”Your name:”, QLineEdit.Normal, “”)
    if okPressed and text != ”:
    print(text)”

    Já criei uma caixa de dialogo no QtCreator, mas estou a ter dificuldade quando vou ao final do código, mais precisamente na função run (“def run(self)”), onde dentro da condição “if result:” tenho de meter a funcionalidade que pretendo executar no plugin.

    Outras das dificuldades que estou a ter é dar uma acção ao botão ok.

    Estou a utilizar este exemplo, mas também não funciona:

    “# See if OK was pressed
    if result:
    QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(“accepted()”), Dialog.accept)
    QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(“rejected()”), Dialog.reject)
    QtCore.QMetaObject.connectSlotsByName(Dialog)”

    1. Bom dia Antonio Castro,

      Segue algumas ideias que você pode utilizar para tentar implementar no seu código:
      1) Na segunda postagem sobre plugins no QGIS (http://2engenheiros.com/2018/07/24/criar-plugin-para-qgis-parte2/), há um código para pegar o caminho que o usuário forneceu, você pode usar algo semelhante para salvar e obter o texto dado pelo usuário;
      2) Tente colocar as funções para obtenção de dados do usuário dentro da função initGui(self).
      3) No final da terceira postagem, você pode conferir o código completo do nosso plugin (http://2engenheiros.com/wp-content/uploads/2018/07/ponto_exato_final.txt) e ele pode dar algumas ideias da estrutura do def run(self).

  3. Ótimo tutorial, mas tenho mais duas duvidas usando o Qt Designer :
    Incluir campos que exibe o conteúdo no formato foto?
    Como incluir um botão para imprimir o conteúdo exibido no formulário customizado?

    1. Bom dia Guilherme,

      Obrigado pelo comentário. Dando uma pesquisa sobre como inserir imagens pelo Qt Designer, vi que não é algo feito diretamente. É necessário realizar algumas linhas de código e um arquivo adicional de python para isso. Na primeira resposta deste StackExchange é possível conferir tal procedimento: https://gis.stackexchange.com/questions/144427/how-to-display-a-picture-in-qgis-custom-form

      Quanto à impressão, você pode usar os comandos que apresentei neste tutorial (as linhas que pedem ao usuário as coordenadas) e depois usar a função print() para que os valores sejam listados no terminal. Caso você esteja falando de imprimir para papel, você pode usar funções para exportar suas variáveis para um arquivo externo (veja mais em: http://www.bosontreinamentos.com.br/programacao-em-python/como-gravar-dados-em-arquivos-de-texto-com-python/).

  4. Boa Tarde,
    Parabens pela iniciativa em compartilhar o conhecimento de vcs..
    Executei os passos deste primeiro tutorial, gerando o plugin ( visualmente , de acordo com o exemplo seu).
    Porem ao executar o plugin, depois de inserir as coordenadas , codigo EPSG e clicar em OK, dá o seguinte erro:
    (“Um erro ocorreu enquanto executava o código Python:

    AttributeError: ‘pontoExatoDialog’ object has no attribute ‘longTextIn’
    Traceback (most recent call last):
    File “C:/Users/Usuario/.qgis2/python/plugins\pontoExato\ponto_exato.py”, line 196, in run
    longX = self.dlg.longTextIn.text()
    AttributeError: ‘pontoExatoDialog’ object has no attribute ‘longTextIn’)

    o que fiz de errado??

    1. Boa tarde Sérgio,

      Confira se no Qt Designer você vinculou a caixa de texto da longitude com o nome “longTextIn”, pois a mensagem de erro informa que esse atributo não existe.

      Você consegue trocar o nome vinculado no Object Inspector do Qt Designer.

      1. Obrigado…
        Era erro básico mesmo que passou desapercebido mesmo apos várias observações.
        Eu havia escrito longTextin e latTextin ( com í minusculo… rs )

        vou pra parte 2 agora…
        valeu pela resposta

  5. Olá amigo estou com dificuldades em realizar a compilação. estou usando python 3.7 e QGIS 3.4. Ele não reconhece o “pyrcc5”. Podes me ajudar

    1. Bom dia Sandro,

      Você esta rodando os comandos dentro do OSGeo4W Shell? Além disso, qual é a mensagem de erro que esta aparecendo para você? Você poderia colocar ela aqui?

      Há duas postagens no StackExchange sobre esse tema que podem te ajudar: <https://gis.stackexchange.com/questions/273552/pyrcc5-is-not-recognized-as-an-internal-or-external-command> e <https://gis.stackexchange.com/questions/313698/fixing-the-resource-compiler-pyrcc5-was-not-found?noredirect=1&lq=1>.

      1. C:\Users\Sandro\Desktop\Plugin\levantamento_topográfico>pyrcc5 -o resources.py r
        esources.qrc
        msg de erro (‘pyrcc5’ não é reconhecido como um comando interno
        ou externo, um programa operável ou um arquivo em lotes.)

        tbm tentei pelo pb_tool e não consegui.

        1. Eu tentei no cmd padrão, no shell, dentro prompt do pycharm.
          consegui que parasse o erro acima incluindo o caminho do pyrccr nas variáveis de sistema. e agora está dando a seguinte msg:
          rodei por ultimo no cmd do wiondows pq no shell continua dando o erro (‘pyrcc5’ não é reconhecido como um comando interno
          ou externo, um programa operável ou um arquivo em lotes.)
          ########
          Microsoft Windows [versão 6.1.7601]
          Copyright (c) 2009 Microsoft Corporation. Todos os direitos reservados.

          C:\Users\Sandro>cd C:\Users\Sandro\Desktop\Plugin\levantamento_topografico

          C:\Users\Sandro\Desktop\Plugin\levantamento_topografico>pyrcc5 -o resources.py r
          esources.qrc
          Traceback (most recent call last):
          File “C:\OSGeo4W64\apps\Python37\lib\runpy.py”, line 193, in _run_module_as_ma
          in
          “__main__”, mod_spec)
          File “C:\OSGeo4W64\apps\Python37\lib\runpy.py”, line 85, in _run_code
          exec(code, run_globals)
          File “C:\OSGeo4W64\apps\Python37\lib\site-packages\PyQt5\pyrcc_main.py”, line
          21, in
          from PyQt5.QtCore import PYQT_VERSION_STR, QDir, QFile
          ImportError: DLL load failed: Não foi possível encontrar o módulo especificado.

          C:\Users\Sandro\Desktop\Plugin\levantamento_topografico>

    2. Que bom que você conseguiu resolver e obrigado por ter compartilhado sua solução (com certeza outros poderão usar ela para resolver problemas semelhantes).

  6. Bom noite, Otimo tutorial!!!
    Bom, estou tentando criar um plugin q faça a leitura de um banco de dados portgress e gere um Croqui, com as informações necessárias.
    Tipo assim, vc bota um numero do lote e ele faz a leitura dos seus atributos(Endereço, nome do proprietário etc…) Poderia me dar um caminho, por inde devo seguir.
    Grato pela atenção.

Deixe uma resposta para SANDRO FARIA Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *