Comment puis-je ajouter un deuxième bouton et boîte de dialogue de barre d'outils à un plugin QGIS construit avec Plugin Builder?

8

Je veux créer une barre d'outils avec 2 boutons, chaque bouton ouvrant un formulaire différent.

Les étapes que j'ai suivies sont:

  • Création d'un plugin à l'aide du générateur de plugins

  • Création d'une barre d'outils avec 2 boutons en effectuant les modifications nécessaires dans le fichier d'implémentation.

Jusqu'à présent, tout fonctionne bien, donc lorsque vous cliquez sur le premier bouton, le formulaire correspondant s'ouvre correctement. Ce formulaire est celui créé par le générateur de plugin.

Ensuite, je veux avoir un deuxième formulaire qui s'ouvrira lorsque le deuxième bouton sera cliqué. Donc:

  • Création d'un nouveau formulaire dans Qt designer (form2.ui),

  • Traduit le fichier ui en fichier py (make) et importé la classe du fichier py traduit dans le fichier d'implémentation, a obtenu une instance de la classe (self.dlg2 = Ui_form2 ())

et dans la méthode run () du fichier d'implémentation, j'ai écrit:

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

Mais je reçois un message d'erreur indiquant que ce nouveau formulaire n'a pas de méthode .show (). Doit-il hériter de quelque chose pour implémenter la méthode .show ()? Mais comment puis-je modifier le code du second formulaire afin d'hériter de quelque chose puisque toutes les modifications dans le fichier py traduit du fichier ui ne peuvent pas être enregistrées?

Eleftheria
la source

Réponses:

5

Voici ce que j'ai fait pour implémenter un deuxième bouton de la barre d'outils et sa boîte de dialogue correspondante:

  1. Modifiez le plugin.pyfichier pour ajouter une run2()méthode, une self.dlg2variable, une nouvelle action dans initGui()et importez:

    from plugin_dialog2 import pluginDialog2
  2. Copiez et collez le fichier d'interface utilisateur et renommez-le en form2.ui(éventuellement, ouvrez-le dans Qt-Designer et modifiez la windowTitlepropriété pour distinguer visuellement les deux boîtes de dialogue).

  3. Copiez et collez le plugin_dialog.pyfichier et renommez-le enplugin_dialog2.py

  4. Modifiez le plugin_dialog2.pyfichier en ajustant le nom de la classe à pluginDialog2, le premier paramètre de super à abcDialog2et le nom du fichier d'interface utilisateur:

    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)
    

Vous pouvez télécharger un plugin de démonstration avec deux boîtes de dialogue à partir d' ici .

Germán Carrillo
la source
Merci beaucoup!!! Cela fonctionne bien et en même temps, cela a permis de mieux comprendre la construction du plugin. Donc, je suppose que la procédure ci-dessus peut être appliquée plusieurs fois, si par exemple je veux avoir 3 ou 4 boutons, chacun s'ouvrant une forme différente. Mais mon 3ème bouton n'apparaît pas dans la barre d'outils. Une idée pourquoi cela se produit?
Eleftheria
2
Bon, cela devrait fonctionner autant de fois que nécessaire, tant que vous conservez un ordre de nommage des variables, des classes, etc. Par exemple, pour ajouter votre 3ème bouton, vous devrez ajouter une nouvelle action de initGui()cette façon: self.add_action( icon_path, text=self.tr(u'plugin3'), callback=self.run3, parent=self.iface.mainWindow())
Germán Carrillo
Eh bien, cela fonctionne bien à la fin après avoir redémarré mon ordinateur ...
Eleftheria
8

1 . Utiliser le générateur de plugins pour créer un nouveau plugin

Les fichiers créés sont illustrés dans l'image suivante

entrez la description de l'image ici

2 . Convertissez le fichier de ressources ( resources.qrc ) en fichier Python ( resources.py ) à l'aide du shell OSGeo4W

pyrcc4 -o resources_rc.py resources.qrc

Après cela, si vous regardez dans le dossier du plugin , vous remarquerez un nouveau fichier .py , le fichier resources.py qui vient d'être créé. Le plugin peut maintenant être installé et ouvert via le menu principal de QGIS> Gérer et installer les plugins.

3 . COMMENT CRÉER LA BARRE D'OUTILS ET LES OUTILS (boutons) ET AJOUTER LES OUTILS SUR LA BARRE D'OUTILS

Ouvrez avec un éditeur le fichier my_toolbar.py et dans la section du initGui (self) écrivez:

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 cette façon, trois boutons / outils ont été créés.

Pour que les boutons apparaissent dans la barre d'outils, continuez à écrire ce qui suit:

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

Pour que les boutons cliquent pour ouvrir une interface graphique, continuez à écrire ce qui suit:

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

Les méthodes runtool1 , runtool2 et runtool3 sont définies ultérieurement comme suit afin d'ouvrir une interface graphique différente pour chaque bouton

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

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

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

De cette façon, lorsque le bouton tool1 est cliqué, le gui dlgtool1 s'ouvrira, lorsque le bouton tool2 sera cliqué, le dlgtool2 s'ouvrira et lorsque le bouton tool3 sera cliqué, le dlgtool3 gui s'ouvrira.

dlgtool1 , dlgtool2 et dlgtool3 doivent être des variables pointant vers les fichiers ui représentant les boîtes de dialogue .

Les dialogues doivent donc être:

  • créé ,

  • importé dans le fichier py principal ( my_toolbar.py ) et

  • assigné aux variables ( dlgtool1 , dlgtool2 et dlgtool3 ) afin d'en obtenir une instance .

Pour créer les dialogues :

  • Copiez les fichiers my_toolbar_dialog.py et my_toolbar_dialog_base.ui et collez-les dans un autre dossier afin de pouvoir les renommer. Faites cela autant de fois que nécessaire, pour cet exemple trois fois. Copiez ensuite ces nouveaux fichiers et collez-les dans le dossier Myplugintoolbar entrez la description de l'image ici

Ouvrez Form_dlgtool1_dialog.py avec un éditeur afin d'appliquer les modifications suivantes:

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)

Changer pour :

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)

Suivez la même procédure pour les deux autres fichiers ( Form_dlgtool2_dialog.py et Form_dlgtool3_dialog.py )

Ensuite, pour importer les boîtes de dialogue dans le fichier principal, ouvrez le fichier my_toolbar.py avec l'éditeur et importez ce qui suit

from Form_dlgtool1_dialog import Formdlgtool1Dialog

from Form_dlgtool2_dialog import Formdlgtool2Dialog

from Form_dlgtool3_dialog import Formdlgtool3Dialog

Enfin, afin d'en obtenir une instance , écrivez ce qui suit dans la section def __init __ (self, iface) :

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

Maintenant, vous pouvez ouvrir les fichiers ui dans QtDesigner et les personnaliser. Rechargez ensuite la barre d'outils du plugin dans QGIS pour obtenir le résultat suivant

entrez la description de l'image ici

Eleftheria
la source