Wie kann ich einem mit Plugin Builder erstellten QGIS-Plugin eine zweite Symbolleistenschaltfläche und einen zweiten Dialog hinzufügen?

8

Ich möchte eine Symbolleiste mit 2 Schaltflächen erstellen, wobei jede Schaltfläche ein anderes Formular öffnet.

Die Schritte, die ich befolgt habe, sind:

  • Erstellt ein Plugin mit dem Plugin Builder

  • Erstellt eine Symbolleiste mit 2 Schaltflächen, indem Sie die erforderlichen Änderungen in der Implementierungsdatei vornehmen.

Bis hier funktioniert alles einwandfrei. Wenn Sie also auf die erste Schaltfläche klicken, wird das entsprechende Formular korrekt geöffnet. Dieses Formular wurde vom Plugin-Builder erstellt.

Dann möchte ich ein zweites Formular haben, das geöffnet wird, wenn auf die zweite Schaltfläche geklickt wird. Damit:

  • Erstellt ein neues Formular in Qt Designer (form2.ui),

  • Übersetzte die UI-Datei in py-Datei (make) und importierte die Klasse aus der übersetzten py-Datei in die Implementierungsdatei, bekam eine Instanz der Klasse (self.dlg2 = Ui_form2 ())

und in der run () -Methode der Implementierungsdatei, die ich geschrieben habe:

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

Aber dann bekomme ich eine Fehlermeldung, dass dieses neue Formular keine .show () -Methode hat. Sollte es etwas erben, um die .show () -Methode zu implementieren? Aber wie kann ich den Code des zweiten Formulars ändern, um etwas zu erben, da nicht alle Änderungen in der übersetzten py-Datei aus der UI-Datei gespeichert werden können?

Eleftheria
quelle

Antworten:

5

Folgendes habe ich getan, um eine zweite Symbolleistenschaltfläche und den entsprechenden Dialog zu implementieren:

  1. Bearbeiten Sie die plugin.pyDatei, um eine run2()Methode, eine self.dlg2Variable, eine neue Aktion initGui()und diesen Import hinzuzufügen :

    from plugin_dialog2 import pluginDialog2
  2. Kopieren Sie die UI-Datei, fügen Sie sie ein und benennen Sie sie um in form2.ui(öffnen Sie sie optional in Qt-Designer und ändern Sie die windowTitleEigenschaft, um beide Dialoge visuell zu unterscheiden).

  3. Kopieren Sie die plugin_dialog.pyDatei, fügen Sie sie ein und benennen Sie sie um inplugin_dialog2.py

  4. Bearbeiten Sie die plugin_dialog2.pyDatei, indem Sie den Klassennamen auf pluginDialog2, den ersten Parameter von super auf abcDialog2und den Namen der UI-Datei anpassen :

    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)
    

Sie können aus einer Demo - Plugin mit zwei Dialogen Download hier .

Germán Carrillo
quelle
Vielen Dank!!! Dies funktioniert einwandfrei und hat gleichzeitig ein besseres Verständnis des Plugin-Aufbaus vermittelt. Daher würde ich davon ausgehen, dass das obige Verfahren mehrmals angewendet werden kann, wenn ich beispielsweise 3 oder 4 Schaltflächen mit jeweils einer Öffnung haben möchte eine andere Form. Meine dritte Schaltfläche wird jedoch nicht in der Symbolleiste angezeigt. Irgendeine Idee, warum das passiert?
Eleftheria
2
Richtig, es sollte so oft funktionieren, wie Sie möchten, solange Sie eine Reihenfolge beibehalten, in der Variablen, Klassen und dergleichen benannt werden. Um beispielsweise Ihre dritte Schaltfläche hinzuzufügen, müssen Sie eine neue Aktion hinzufügen initGui(): self.add_action( icon_path, text=self.tr(u'plugin3'), callback=self.run3, parent=self.iface.mainWindow())
Germán Carrillo
Nun, es funktioniert am Ende
Eleftheria
8

1 . Verwenden Sie den Plugin Builder , um ein neues Plugin zu erstellen

Die erstellten Dateien sind im folgenden Bild dargestellt

Geben Sie hier die Bildbeschreibung ein

2 . Konvertieren Sie die Ressourcen - Datei ( resources.qrc ) zu Python - Datei ( resources.py ) unter Verwendung der OSGeo4W Shell

pyrcc4 -o resources_rc.py resources.qrc

Wenn Sie danach in den Plugin-Ordner schauen , werden Sie eine neue .py-Datei bemerken , die Datei resources.py , die gerade erstellt wurde. Das Plugin kann jetzt über das QGIS-Hauptmenü> Plugins verwalten und installieren installiert und geöffnet werden.

3 . WIE ERSTELLEN SIE DIE WERKZEUGLEISTE UND DIE WERKZEUGE (Knöpfe) UND FÜGEN SIE DIE WERKZEUGE AUF DIE WERKZEUGLEISTE?

Öffnen Sie mit einem Editor die Datei my_toolbar.py und schreiben Sie im Abschnitt des initGui (self) :

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

Auf diese Weise wurden drei Schaltflächen / Werkzeuge erstellt.

Schreiben Sie Folgendes, damit die Schaltflächen in der Symbolleiste angezeigt werden:

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

Damit die Schaltflächen beim Klicken zum Öffnen einer GUI angeklickt werden, schreiben Sie Folgendes:

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

Die Methoden runtool1 , runtool2 und runtool3 werden später wie folgt definiert, um für jede Schaltfläche eine andere Benutzeroberfläche zu öffnen

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

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

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

Auf diese Weise wird beim Klicken auf die Schaltfläche tool1 die Benutzeroberfläche geöffnet. Wenn auf die Schaltfläche tool2 geklickt wird, wird die Schaltfläche dlgtool2 geöffnet, und wenn auf die Schaltfläche tool3 geklickt wird, wird die Benutzeroberfläche dlgtool3 geöffnet.

dlgtool1 , dlgtool2 und dlgtool3 sollten Variablen sein, die auf die UI-Dateien zeigen, die die Dialoge darstellen .

Die Dialoge müssen also sein:

  • erstellt ,

  • in die Haupt-py-Datei ( my_toolbar.py ) importiert und

  • Variablen ( dlgtool1 , dlgtool2 und dlgtool3 ) zugewiesen, um eine Instanz von ihnen zu erhalten.

So erstellen Sie die Dialoge :

  • Kopieren Sie die Dateien my_toolbar_dialog.py und my_toolbar_dialog_base.ui und fügen Sie sie in einen anderen Ordner ein, damit Sie sie umbenennen können. Tun Sie dies so oft wie nötig, in diesem Beispiel dreimal. Kopieren Sie dann diese neuen Dateien und fügen Sie sie wieder in den Ordner Myplugintoolbar ein Geben Sie hier die Bildbeschreibung ein

Öffnen Sie Form_dlgtool1_dialog.py mit einem Editor, um die folgenden Änderungen zu übernehmen:

Von :

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)

Wechseln zu :

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)

Gehen Sie für die beiden anderen Dateien genauso vor ( Form_dlgtool2_dialog.py und Form_dlgtool3_dialog.py ).

Dann , um die Dialoge in die Hauptdatei zu importieren , öffnen my_toolbar.py Datei mit dem Editor und importieren Sie die folgende

from Form_dlgtool1_dialog import Formdlgtool1Dialog

from Form_dlgtool2_dialog import Formdlgtool2Dialog

from Form_dlgtool3_dialog import Formdlgtool3Dialog

Schließlich , um eine Instanz von ihnen zu erhalten , schreiben Sie die folgenden in der def __init __ (self, iface) Abschnitt:

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

Jetzt können Sie die UI-Dateien im QtDesigner öffnen und anpassen. Laden Sie dann die Plugin-Symbolleiste in QGIS neu, um das folgende Ergebnis zu erhalten

Geben Sie hier die Bildbeschreibung ein

Eleftheria
quelle