Como posso adicionar um segundo botão e caixa de diálogo da barra de ferramentas a um plug-in QGIS criado com o Plugin Builder?

8

Quero criar uma barra de ferramentas com 2 botões, cada botão abrindo um formulário diferente.

Os passos que segui são:

  • Criou um plugin usando o construtor Plugin

  • Criou uma barra de ferramentas com 2 botões, fazendo as modificações necessárias no arquivo de implementação.

Até aqui, tudo funciona bem; portanto, quando o primeiro botão é clicado, o formulário correspondente é aberto corretamente. Este formulário é o criado pelo construtor Plugin.

Quero ter um segundo formulário que será aberto quando o segundo botão for clicado. Assim:

  • Criou um novo formulário no designer Qt (form2.ui),

  • Traduziu o arquivo da interface do usuário para o arquivo py (make) e importou a classe do arquivo py traduzido no arquivo de implementação, obteve uma instância da classe (self.dlg2 = Ui_form2 ())

e no método run () do arquivo de implementação que escrevi:

def run2(self):
    self.dlg2.show()
    result = self.dlg2.exec_()

Mas, em seguida, recebo uma mensagem de erro informando que esse novo formulário não possui o método .show (). Ele deve herdar algo para implementar o método .show ()? Mas como posso modificar o código do segundo formulário para herdar algo, pois todas as alterações no arquivo py traduzido do arquivo da interface do usuário não podem ser salvas?

Eleftheria
fonte

Respostas:

5

Aqui está o que eu fiz para implementar um segundo botão da barra de ferramentas e sua caixa de diálogo correspondente:

  1. Edite o plugin.pyarquivo para adicionar um run2()método, uma self.dlg2variável, uma nova ação initGui()e esta importação:

    from plugin_dialog2 import pluginDialog2
  2. Copie e cole o arquivo da interface do usuário e renomeie-o como form2.ui(opcionalmente, abra-o no Qt-Designer e altere a windowTitlepropriedade para distinguir visualmente os dois diálogos).

  3. Copie e cole o plugin_dialog.pyarquivo e renomeie-o comoplugin_dialog2.py

  4. Edite o plugin_dialog2.pyarquivo ajustando o nome da classe pluginDialog2, o primeiro parâmetro de super para abcDialog2e o nome do arquivo da interface do usuário:

    import os
    from PyQt4 import QtGui, uic
    
    FORM_CLASS, _ = uic.loadUiType(os.path.join(
        os.path.dirname(__file__), 'form2.ui'))
    
    class abcDialog2(QtGui.QDialog, FORM_CLASS):
        def __init__(self, parent=None):
            """Constructor."""
            super(abcDialog2, self).__init__(parent)
            self.setupUi(self)

Você pode baixar um plugin de demonstração com duas caixas de diálogo aqui .

Germán Carrillo
fonte
Muito obrigado!!! Isso está funcionando bem e, ao mesmo tempo, deu uma melhor compreensão do edifício do plug-in. Então, eu suponho que o procedimento acima possa ser aplicado mais vezes, se, por exemplo, eu quiser ter 3 ou 4 botões, cada um abrindo uma forma diferente. Mas meu terceiro botão não aparece na barra de ferramentas. Alguma idéia de por que isso está acontecendo?
Eleftheria
2
Certo, ele deve funcionar quantas vezes você precisar, desde que mantenha uma ordem para nomear variáveis, classes e similares. Por exemplo, para adicionar seu terceiro botão, você precisará adicionar uma nova ação initGui(), desta maneira: self.add_action( icon_path, text=self.tr(u'plugin3'), callback=self.run3, parent=self.iface.mainWindow())
Germán Carrillo
Bem, ele funciona ok no final depois que eu reiniciei meu computador ...
Eleftheria
8

1 . Use o construtor Plugin para criar um novo plugin

Os arquivos criados são mostrados na figura a seguir

insira a descrição da imagem aqui

2 . Converta o arquivo de recursos ( resources.qrc ) em arquivo Python ( resources.py ) usando o OSGeo4W Shell

pyrcc4 -o resources_rc.py resources.qrc

Depois disso, se você olhar dentro da pasta do plug-in , notará um novo arquivo .py , o arquivo resources.py que acabou de ser criado. O plug-in agora pode ser instalado e aberto através do menu principal do QGIS> Gerenciar e instalar plug-ins.

3 . COMO CRIAR A BARRA DE FERRAMENTAS E AS FERRAMENTAS (botões) E ADICIONAR AS FERRAMENTAS NA BARRA DE FERRAMENTAS

Abra com um editor o arquivo my_toolbar.py e, na seção do initGui (self), escreva:

def initGui(self):

    self.toolBar = self.iface.addToolBar("MY TOOLBAR tools")
    self.toolBar.setObjectName("MY TOOLBAR tools")

    self.act1 = QAction(QIcon(":/plugins/Myplugintoolbar/icon.png"), QCoreApplication.translate("IMPRESStoolbar", "Tool1"), self.iface.mainWindow())
    self.act2 = QAction(QIcon(":/plugins/Myplugintoolbar/icon.png"), QCoreApplication.translate("IMPRESStoolbar", "Tool2"), self.iface.mainWindow())
    self.act3 = QAction(QIcon(":/plugins/Myplugintoolbar/icon.png"), QCoreApplication.translate("IMPRESStoolbar", "Tool3"), self.iface.mainWindow())

Dessa forma, três botões / ferramentas foram criados.

Para que os botões apareçam na barra de ferramentas, continue escrevendo o seguinte:

    self.toolBar.addAction(self.act1)
    self.toolBar.addAction(self.act2)
    self.toolBar.addAction(self.act3)

Para que os botões sejam clicados para abrir uma GUI, continue escrevendo o seguinte:

    QObject.connect(self.act1, SIGNAL("triggered()"), self.runtool1)
    QObject.connect(self.act2, SIGNAL("triggered()"), self.runtool2)
    QObject.connect(self.act3, SIGNAL("triggered()"), self.runtool3)

Os métodos runtool1 , runtool2 e runtool3 são definidos posteriormente como a seguir para abrir uma interface gráfica diferente para cada botão

def runtool1(self):
     self.dlgtool1.show()

def runtool2(self):
     self.dlgtool2.show()

def runtool3(self):
     self.dlgtool3.show()

Dessa forma, quando o botão da ferramenta1 é clicado, o gui dlgtool1 será aberto, quando o botão da ferramenta2 for clicado, o dlgtool2 será aberto e quando o botão da ferramenta3 for clicado, o gui do dlgtool3 será aberto.

dlgtool1 , dlgtool2 e dlgtool3 devem ser variáveis apontando para os arquivos da interface do usuário que representam os diálogos .

Portanto, os diálogos devem ser:

  • criado ,

  • importados para o arquivo py principal ( my_toolbar.py ) e

  • atribuído a variáveis ( dlgtool1 , dlgtool2 e dlgtool3 ) para obter uma instância delas.

Para criar os diálogos :

  • Copie os arquivos my_toolbar_dialog.py e my_toolbar_dialog_base.ui e cole-os dentro de outra pasta para poder renomeá-los. Faça isso quantas vezes for necessário, para este exemplo três vezes. Em seguida, copie esses novos arquivos e cole-os de volta na pasta Myplugintoolbar insira a descrição da imagem aqui

Abra Form_dlgtool1_dialog.py com um editor para aplicar as seguintes modificações:

De :

import os
from PyQt4 import QtGui, uic

FORM_CLASS, _ = uic.loadUiType(os.path.join(
    os.path.dirname(__file__), 'my_toolbar_dialog_base.ui'))

class MyplugintoolbarDialog(QtGui.QDialog, FORM_CLASS):
    def __init__(self, parent=None):
        super(MyplugintoolbarDialog, self).__init__(parent)
        self.setupUi(self)

Mude para :

import os
from PyQt4 import QtGui, uic

FORM_CLASS, _ = uic.loadUiType(os.path.join(
    os.path.dirname(__file__), 'Form_dlgtool1.ui'))

class Formdlgtool1Dialog(QtGui.QDialog, FORM_CLASS):
    def __init__(self, parent=None):
        super(Formdlgtool1Dialog, self).__init__(parent)
        self.setupUi(self)

Siga o mesmo procedimento para os outros dois arquivos ( Form_dlgtool2_dialog.py e Form_dlgtool3_dialog.py )

Em seguida, para importar as caixas de diálogo para o arquivo principal, abra o arquivo my_toolbar.py com o editor e importe o seguinte

from Form_dlgtool1_dialog import Formdlgtool1Dialog

from Form_dlgtool2_dialog import Formdlgtool2Dialog

from Form_dlgtool3_dialog import Formdlgtool3Dialog

Por fim, para obter uma instância deles , escreva o seguinte na seção def __init __ (self, iface) :

self.dlgtool1 = Formdlgtool1Dialog()
self.dlgtool2 = Formdlgtool2Dialog()
self.dlgtool3 = Formdlgtool3Dialog()

Agora, você pode abrir os arquivos da interface do usuário no QtDesigner e personalizá-los. Em seguida, recarregue a barra de ferramentas do plugin dentro do QGIS para obter o seguinte resultado

insira a descrição da imagem aqui

Eleftheria
fonte