¿Cómo puedo agregar un segundo botón y cuadro de diálogo de la barra de herramientas a un complemento QGIS creado con el Creador de complementos?

8

Quiero crear una barra de herramientas con 2 botones, cada botón abriendo una forma diferente.

Los pasos que seguí son:

  • Creó un complemento con el generador de complementos

  • Creó una barra de herramientas con 2 botones haciendo las modificaciones necesarias en el archivo de implementación.

Hasta aquí, todo funciona bien, por lo que cuando se hace clic en el primer botón, el formulario correspondiente se abre correctamente. Este formulario es el creado por el generador de complementos.

Entonces quiero tener un segundo formulario que se abrirá cuando se haga clic en el segundo botón. Entonces:

  • Creó un nuevo formulario en Qt Designer (form2.ui),

  • Tradujo el archivo ui al archivo py (make) e importó la clase del archivo py traducido al archivo de implementación, obtuve una instancia de la clase (self.dlg2 = Ui_form2 ())

y en el método run () del archivo de implementación escribí:

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

Pero luego recibo un mensaje de error de que este nuevo formulario no tiene el método .show (). ¿Debería heredar algo para implementar el método .show ()? Pero, ¿cómo puedo modificar el código de la segunda forma para heredar algo ya que no se pueden guardar todos los cambios en el archivo py traducido del archivo ui?

Eleftheria
fuente

Respuestas:

5

Esto es lo que hice para implementar un segundo botón de la barra Google y su cuadro de diálogo correspondiente:

  1. Edite el plugin.pyarchivo para agregar un run2()método, una self.dlg2variable, una nueva acción initGui()y esta importación:

    from plugin_dialog2 import pluginDialog2
  2. Copie y pegue el archivo UI y cámbiele el nombre a form2.ui(opcionalmente, ábralo en Qt-Designer y cambie la windowTitlepropiedad para distinguir visualmente ambos diálogos).

  3. Copia y pega el plugin_dialog.pyarchivo y renómbralo comoplugin_dialog2.py

  4. Edite el plugin_dialog2.pyarchivo ajustando el nombre de la clase pluginDialog2, el primer parámetro de super abcDialog2y el nombre del archivo de la interfaz de usuario:

    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)

Puede descargar un complemento de demostración con dos cuadros de diálogo desde aquí .

Germán Carrillo
fuente
¡¡¡Muchas gracias!!! Esto está funcionando bien y al mismo tiempo dio una mejor comprensión de la construcción del complemento. Por lo tanto, supongo que el procedimiento anterior se puede aplicar más veces, si por ejemplo quiero tener 3 o 4 botones, cada uno abierto Una forma diferente. Pero mi tercer botón no aparece en la barra de herramientas. ¿Alguna idea de por qué está sucediendo esto?
Eleftheria
2
Correcto, debería funcionar tantas veces como sea necesario, siempre y cuando mantenga un orden para nombrar variables, clases y similares. Por ejemplo, para agregar su tercer botón necesitaría agregar una nueva acción de initGui()esta manera: self.add_action( icon_path, text=self.tr(u'plugin3'), callback=self.run3, parent=self.iface.mainWindow())
Germán Carrillo
Bueno, funciona bien al final después de reiniciar mi computadora ...
Eleftheria
8

1 . Use el generador de complementos para crear un nuevo complemento

Los archivos creados se muestran en la siguiente imagen

ingrese la descripción de la imagen aquí

2 . Convierta el archivo de recursos ( resources.qrc ) en un archivo de Python ( resources.py ) utilizando el Shell OSGeo4W

pyrcc4 -o resources_rc.py resources.qrc

Después de eso, si mira dentro de la carpeta del complemento , notará un nuevo archivo .py , el archivo resources.py que acaba de crear. El complemento ahora se puede instalar y abrir a través del menú principal de QGIS> Administrar e instalar complementos.

3 . CÓMO CREAR LA BARRA DE HERRAMIENTAS Y LAS HERRAMIENTAS (botones) Y AGREGAR LAS HERRAMIENTAS EN LA BARRA DE HERRAMIENTAS

Abra con un editor el archivo my_toolbar.py y en la sección de initGui (self) escriba:

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())

De esta forma se han creado tres botones / herramientas.

Para que los botones aparezcan en la barra de herramientas, continúe escribiendo lo siguiente:

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

Para que los botones al hacer clic para abrir una interfaz gráfica de usuario continúen escribiendo lo siguiente:

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

Los métodos runtool1 , runtool2 y runtool3 se definen más adelante de la siguiente manera para abrir una interfaz gráfica de usuario diferente para cada botón

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

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

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

De esta forma cuando el botón Tool1 se hace clic en la interfaz gráfica de usuario dlgtool1 se abrirá, cuando el botón tool2 se hace clic en el dlgtool2 se abrirá y cuando el botón Tool3 se hace clic en el dlgtool3 interfaz gráfica de usuario se abrirá.

dlgtool1 , dlgtool2 y dlgtool3 deben ser variables que apuntan a los archivos ui que representan los cuadros de diálogo .

Entonces los diálogos tienen que ser:

  • creado ,

  • importado al archivo py principal ( my_toolbar.py ) y

  • asignado a las variables ( dlgtool1 , dlgtool2 y dlgtool3 ) para obtener una instancia de ellas.

Para crear los diálogos :

  • Copie los archivos my_toolbar_dialog.py y my_toolbar_dialog_base.ui y péguelos dentro de otra carpeta para que pueda cambiarles el nombre. Haga esto tantas veces como sea necesario, para este ejemplo tres veces. Luego copie estos archivos nuevos y péguelos de nuevo en la carpeta Myplugintoolbar ingrese la descripción de la imagen aquí

Abra Form_dlgtool1_dialog.py con un editor para aplicar las siguientes modificaciones:

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)

Cambiar a :

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 el mismo procedimiento para los otros dos archivos ( Form_dlgtool2_dialog.py y Form_dlgtool3_dialog.py )

Luego, para importar los cuadros de diálogo en el archivo principal, abra el archivo my_toolbar.py con el editor e importe lo siguiente

from Form_dlgtool1_dialog import Formdlgtool1Dialog

from Form_dlgtool2_dialog import Formdlgtool2Dialog

from Form_dlgtool3_dialog import Formdlgtool3Dialog

Finalmente, para obtener una instancia de ellos , escriba lo siguiente dentro de la sección def __init __ (self, iface) :

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

Ahora, puede abrir los archivos ui en QtDesigner y personalizarlos. Luego vuelva a cargar la barra de herramientas del complemento dentro de QGIS para obtener el siguiente resultado

ingrese la descripción de la imagen aquí

Eleftheria
fuente