Вы находитесь на странице: 1из 24

Author

Ujaval Gandhi

Follow @spatialthoughts

Change Language

English

Download PDF
[A4] (../pdf/building_a_python_plugin_a4.pdf) [Letter] (../pdf/building_a_python_plugin_letter.pdf)

Share

Building a Python Plugin


Plugins are a great way to extend the functionality of QGIS. You can write plugins using Python that can range from adding a simple button to sohpisticated toolkits.
This tutorial will outline the process involved in setting up your development environment, designing the user interface for a plugin and writing code to interact with
QGIS. Please review the Getting Started With Python Programming (getting_started_with_pyqgis.html) tutorial to get familiar with the basics.

Overview of the Task


We will develop a simple plugin called Save Attributes that will allow users to pick a vector layer and write its attributes to a CSV le.

Get the Tools


Qt Creator
Qt (http://www.qt.io/) is a software development framework that is used to develop applications that run on Windows, Mac, Linux as well as various mobile operating
systems. QGIS itself is written using the Qt framework. For plugin development, we will use an application called Qt Creator (http://doc.qt.io/qtcreator/index.html) to
design the interface for our plugin.

Download and install the Qt Creator software from SourgeForge (http://sourceforge.net/projects/qtcreator.mirror/ les/latest/download)

Python Bindings for Qt


Since we are developing the plugin in Python, we need to install the python bindings for Qt. The method for installing these will depend on the platform you are
using. For building plugins we need the pyrcc4 command-line tool.

Windows

Download the OSGeo4W network installer (http://trac.osgeo.org/osgeo4w/) and choose Express Desktop Install. Install the package QGIS . After installation, you will
be able to access the pyrcc4 tool via the OSGeo4W Shell.

Mac

Install the Homebrew (http://brew.sh) package manager. Install PyQt package by running the following command:

brew install pyqt

Linux

Depending on your distribution, nd and install the python-qt4 package. On Ubuntu and Debian-based distributions, you can run the following command:

sudo apt-get install python-qt4

A Text Editor or a Python IDE


Any kind of software development requires a good text editor. If you already have a favorite text editor or an IDE (Integrated Development Environment), you may
use it for this tutorial. Otherwise, each platform o ers a wide variety of free or paid options for text editors. Choose the one that ts your needs.

This tutorial uses Notepad++ editor on Windows.

Windows

Notepad++ (http://notepad-plus-plus.org/) is a good free editor for windows. Download and install the Notepad++ editor (http://notepad-plus-
plus.org/repository/6.x/6.7.5/npp.6.7.5.Installer.exe).

Note
If you are using Notepad++, makes sure to check Replace by space at Settings Preferences Tab Settings. Python is very sensitive about whitespace and this
setting will ensure tabs and spaces are treated properly.

Plugin Builder plugin


There is a helpful QGIS plugin named Plugin Builder which creates all the necessary les and the boilerplate code for a plugin. Find and install the Plugin
Builder plugin. See Using Plugins (using_plugins.html) for more details on how to install plugins.

Plugins Reloader plugin


This is another helper plugin which allows iterative development of plugins. Using this plugin, you can change your plugin code and have it re ected in QGIS without
having to restart QGIS every time. Find and install the Plugin Reloader plugin. See Using Plugins (using_plugins.html) for more details on how to install plugins.

Note
Plugin Reloader is an experimental plugin. Make sure you have checked Show also experimental plugins in Plugin Manager settings if you cannot nd it.

Procedure
1. Open QGIS. Go to Plugins Plugin Builder Plugin Builder.

2. You will see the QGIS Plugin Builder dialog with a form. You can ll the form with details relating to our plugin. The Class name will be the name of the Python
Class containing the logic of the plugin. This will also be the name of the folder containing all the plugin les. Enter SaveAttributes as the class name. The
Plugin name is the name under which your plugin will appear in the Plugin Manager. Enter the name as Save Attributes . Add a description in the Description
eld. The Module name will be the name of the main python le for the plugin. Enter it as save_attributes . Leave the version numbers as they are. The Text
for menu item value will be how the users will nd your plugin in QGIS menu. Enter it as Save Attributes as CSV . Enter your name and email address in the
appropriate elds. The Menu eld will decide where your plugin item is added in QGIS. Since our plugin is for vector data, select Vector . Check the Flag the
plugin as experimental box at the bottom. Click OK.
3. Next, you will be prompted to choose a directory for your plugin. You need to browse to the QGIS python plugin directory on your computer and select Select
Folder. Typically, a .qgis2/ directory is located in your home directory. The plugin folder location will depend on your platform as follows: (Replace
username with your login name)

Windows

c:\Users\username\.qgis2\python\plugins

Mac

/Users/username/.qgis2/python/plugins

Linux

/home/username/.qgis2/python/plugins

4. You will see a con rmation dialog once your plugin template is created. Note the path to the plugin folder.
5. Before we can use the newly created plugin, we need to compile the resources.qrc le that was created by Plugin Builder. Launch the OSGeo4W Shell on
windows or a terminal on Mac or Linux.

6. Browse to the plugin directory where the output of Plugin Builder was created. You can use the cd command followed by the path to the directory.

cd c:\Users\username\.qgis2\python\plugins\SaveAttributes

7. Once you are in the directory, type make . This will run the pyrcc4 command that we had installed as part of Qt bindings for Python.
make

8. Now we are ready to have a rst look at the brand new plugin we created. Close QGIS and launch it again. Go to Plugins Manage and Install plugins and enable
the Save Attributes plugin in the Installed tab. You will notice that there is a new icon in the toolbar and a new menu entry under Vector Save Attributes
Save Attributes as CSV`. Select it to launch the plugin dialog.

9. You will notice a new blank dialog named Save Attributes. Close this dialog.
10. We will now design our dialog box and add some user interface elements to it. Open the Qt Creator program and to to File > Open File or Project....

11. Browse to the plugin directory and select the save_attributes_dialog_base.ui le. Click Open.

12. You will see the blank dialog from the plugin. You can drag-and-drop elements from the left-hand panel on the dialog. We will add a Combo Box type of Input
Widget. Drag it to the plugin dialog.
13. Resize the combo box and adjust its size. Now drag a Label type Display Widget on the dialog.

14. Click on the label text and enter Select a layer .


15. Save this le by going to File Save save_attributes_dialog_base.ui. Note the name of the combo box object is comboBox . To interact with this object using
python code, we will have to refer to it by this name.

16. Lets reload our plugin so we can see the changes in the dialog window. Go to Plugin Plugin Reloader Choose a plugin to be reloaded.
17. Select SaveAttributes in the Congure Plugin reloader dialog.

18. Now click the Save Attributes as CSV button. You will see the newly designed dialog box.
19. Lets add some logic to the plugin that will populate the combo box with the layers loaded in QGIS. Go to the plugin directory and load the le
save_attributes.py in a text editor. Scroll down and nd the run(self) method. This method will be called when you click the toolbar button or select the
plugin menu item. Add the following code at the beginning of the method. This code gets the layers loaded in QGIS and adds it to the comboBox object from
the plugin dialog.

layers = self.iface.legendInterface().layers()
layer_list = []
for layer in layers:
layer_list.append(layer.name())
self.dlg.comboBox.addItems(layer_list)
20. Back in the main QGIS window, reload the plugin by going to Plugins Plugin Reloader Reload plugin: SaveAttributes. Alternatively, you can just press F5 . To
test this new functionality, we must load some layers in QGIS. After you load some data, launch the plugin by going to Vector Save Attributes Save Attributes
as CSV.

21. You will see that our combo box is now populated with the layer names that are loaded in QGIS.
22. Lets add remaining user interface elements. Switch back to Qt Creator and load the save_attributes_dialog_base.ui le. Add a Label Display Widget
and change the text to Select output file . Add a LineEdit type Input Widget that will show the output le path that the user has chosen. Next, add a
Push Button type Button and change the button label to ... . Note the object names of the widgets that we will have to use to interact with them. Save the
le.

23. We will now add python code to open a le browser when the user clicks the ... push button and show the select path in the line edit widget. Open the
save_attributes.py le in a text editor. Add QFileDialog to our list of imports at the top of the le.
24. Add a new method called select_output_file with the following code. This code will open a le browser and populate the line edit widget with the path of
the le that the user chose.

def select_output_file(self):
filename = QFileDialog.getSaveFileName(self.dlg, "Select output file ","", '*.txt')
self.dlg.lineEdit.setText(filename)

25. Now we need to add code so that when the ... button is clicked, select_output_file method is called. Scroll up to the __init__ method and add the
following lines at the bottom. This code will clear the previously loaded text (if any) in the line edit widget and also connect the select_output_file method
to the clicked signal of the push button widget.
self.dlg.lineEdit.clear()
self.dlg.pushButton.clicked.connect(self.select_output_file)

26. Back in QGIS, reload the plugin and open the Save Attributes` dialog. If all went ne, you will be able to click the ... button and select an output text le from
your disk.

27. When you click OK on the plugin dialog, nothing happens. That is because we have not added the logic to pull attribute information from the layer and write it
to the text le. We now have all the pieces in place to do just that. Find the place in the run method where it says pass . Replace it with the code below. The
explanation for this code can be found in Getting Started With Python Programming (getting_started_with_pyqgis.html).

filename = self.dlg.lineEdit.text()
output_file = open(filename, 'w')

selectedLayerIndex = self.dlg.comboBox.currentIndex()
selectedLayer = layers[selectedLayerIndex]
fields = selectedLayer.pendingFields()
fieldnames = [field.name() for field in fields]

for f in selectedLayer.getFeatures():
line = ','.join(unicode(f[x]) for x in fieldnames) + '\n'
unicode_line = line.encode('utf-8')
output_file.write(unicode_line)
output_file.close()
28. Now our plugin is ready. Reload the plugin and try it out. You will nd that the output text le you chose will have the attributes from the vector layer. You can
zip the plugin directory and share it with your users. They can unzip the contents to their plugin directory and try out your plugin. If this was a real plugin, you
would upload it to the QGIS Plugin Repository (https://plugins.qgis.org/) so that all QGIS users will be able to nd and download your plugin.

Note
This plugin is for demonstration purpose only. Do not publish this plugin or upload it to the QGIS plugin repository.

Below is the full save_attributes.py le as a reference.


# -*- coding: utf-8 -*-
"""
/***************************************************************************
SaveAttributes
A QGIS plugin
This plugin saves the attribute of the selected vector layer as a CSV file.
-------------------
begin : 2015-04-20
git sha : $Format:%H$
copyright : (C) 2015 by Ujaval Gandhi
email : ujaval@spatialthoughts.com
***************************************************************************/

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
"""
from PyQt4.QtCore import QSettings, QTranslator, qVersion, QCoreApplication
from PyQt4.QtGui import QAction, QIcon, QFileDialog
# Initialize Qt resources from file resources.py
import resources_rc
# Import the code for the dialog
from save_attributes_dialog import SaveAttributesDialog
import os.path

class SaveAttributes:
"""QGIS Plugin Implementation."""

def __init__(self, iface):


"""Constructor.

:param iface: An interface instance that will be passed to this class


which provides the hook by which you can manipulate the QGIS
application at run time.
:type iface: QgsInterface
"""
# Save reference to the QGIS interface
self.iface = iface
# initialize plugin directory
self.plugin_dir = os.path.dirname(__file__)
# initialize locale
locale = QSettings().value('locale/userLocale')[0:2]
locale_path = os.path.join(
self.plugin_dir,
'i18n',
'SaveAttributes_{}.qm'.format(locale))

if os.path.exists(locale_path):
self.translator = QTranslator()
self.translator.load(locale_path)

if qVersion() > '4.3.3':


QCoreApplication.installTranslator(self.translator)

# Create the dialog (after translation) and keep reference


self.dlg = SaveAttributesDialog()

# Declare instance attributes


self.actions = []
self.menu = self.tr(u'&Save Attributes')
# TODO: We are going to let the user set this up in a future iteration
self.toolbar = self.iface.addToolBar(u'SaveAttributes')
self.toolbar.setObjectName(u'SaveAttributes')

self.dlg.lineEdit.clear()
self.dlg.pushButton.clicked.connect(self.select_output_file)

# noinspection PyMethodMayBeStatic
def tr(self, message):
"""Get the translation for a string using Qt translation API.

We implement this ourselves since we do not inherit QObject.

:param message: String for translation.


:type message: str, QString

:returns: Translated version of message.


:rtype: QString
"""
# noinspection PyTypeChecker,PyArgumentList,PyCallByClass
return QCoreApplication.translate('SaveAttributes', message)

def add_action(
self,
icon_path,
text,
callback,
enabled_flag=True,
add_to_menu=True,
add_to_toolbar=True,
status_tip=None,
whats_this=None,
parent=None):
"""Add a toolbar icon to the toolbar.

:param icon_path: Path to the icon for this action. Can be a resource
path (e.g. ':/plugins/foo/bar.png') or a normal file system path.
:type icon_path: str

:param text: Text that should be shown in menu items for this action.
:type text: str

:param callback: Function to be called when the action is triggered.


:type callback: function

:param enabled_flag: A flag indicating if the action should be enabled


by default. Defaults to True.
:type enabled_flag: bool

:param add_to_menu: Flag indicating whether the action should also


be added to the menu. Defaults to True.
:type add_to_menu: bool

:param add_to_toolbar: Flag indicating whether the action should also


be added to the toolbar. Defaults to True.
:type add_to_toolbar: bool

:param status_tip: Optional text to show in a popup when mouse pointer


hovers over the action.
:type status_tip: str

:param parent: Parent widget for the new action. Defaults None.
:type parent: QWidget

:param whats_this: Optional text to show in the status bar when the
mouse pointer hovers over the action.

:returns: The action that was created. Note that the action is also
added to self.actions list.
:rtype: QAction
"""

icon = QIcon(icon_path)
action = QAction(icon, text, parent)
action.triggered.connect(callback)
action.setEnabled(enabled_flag)

if status_tip is not None:


action.setStatusTip(status_tip)

if whats_this is not None:


action.setWhatsThis(whats_this)

if add_to_toolbar:
self.toolbar.addAction(action)

if add_to_menu:
self.iface.addPluginToVectorMenu(
self.menu,
action)

self.actions.append(action)

return action

def initGui(self):
"""Create the menu entries and toolbar icons inside the QGIS GUI."""

icon_path = ':/plugins/SaveAttributes/icon.png'
self.add_action(
icon_path,
text=self.tr(u'Save Attributes as CSV'),
callback=self.run,
parent=self.iface.mainWindow())
def unload(self):
"""Removes the plugin menu item and icon from QGIS GUI."""
for action in self.actions:
self.iface.removePluginVectorMenu(
self.tr(u'&Save Attributes'),
action)
self.iface.removeToolBarIcon(action)
# remove the toolbar
del self.toolbar

def select_output_file(self):
filename = QFileDialog.getSaveFileName(self.dlg, "Select output file ","", '*.txt')
self.dlg.lineEdit.setText(filename)

def run(self):
"""Run method that performs all the real work"""
layers = self.iface.legendInterface().layers()
layer_list = []
for layer in layers:
layer_list.append(layer.name())

self.dlg.comboBox.addItems(layer_list)
# show the dialog
self.dlg.show()
# Run the dialog event loop
result = self.dlg.exec_()
# See if OK was pressed
if result:
# Do something useful here - delete the line containing pass and
# substitute with your code.
filename = self.dlg.lineEdit.text()
output_file = open(filename, 'w')

selectedLayerIndex = self.dlg.comboBox.currentIndex()
selectedLayer = layers[selectedLayerIndex]
fields = selectedLayer.pendingFields()
fieldnames = [field.name() for field in fields]

for f in selectedLayer.getFeatures():
line = ','.join(unicode(f[x]) for x in fieldnames) + '\n'
unicode_line = line.encode('utf-8')
output_file.write(unicode_line)
output_file.close()

48 Comments QGIS Tutorials and Tips


1 Login

Sort by Best
Recommend 4 Share

Join the discussion

Mark Owen-Falkenberg 7 months ago


Hi everybody. I am making a plugin where I want to add a folder path via a QFileDialog as in the above example. I use the
QFileDialog.getExistingDirectory function and it all works ne. However if I close the plugin and open it again, then click the pushbutton to add a
path, the opened window for choosing the path will re-open after I choose a path or close it. If I close the plugin a open it again the 'choose path'
window will reopen 3 time and so on... Has anyone else experienced thia and is there a solution?
1 Reply Share

Mark Owen-Falkenberg > Mark Owen-Falkenberg 7 months ago


screenshot
Reply Share

Ooju, Oluwafemi Emmanuel 7 months ago


Hi All, I am new to plugin dev and I was given a task to develop a plugin that can automatically update two eld in a table with timestamp and also
source with current timestamp and also the user name. Please anyone with help its urgent.
Thanks
1 Reply Share

Abby a year ago


Hi, Thank you for providing very helpful tutorials. However, I am nding it dicult to nd information on how to connect dierent QWidgets that
were created independent of the .ui le, and add them into the plugin using the les provided by the plugin builder. Which les provided by the
plugin builder should these be added and where in the le?
1 Reply Share

Ujaval Gandhi Mod > Abby a year ago

Good question. To integrate the .ui le you need to create a new .py le similar to save_attributes_dialog.py. Then import the Dialog from
that .py le into the save_attributes.py le to use it.
1 Reply Share

Ashwin Bhayal a year ago


Iam not able to import a shaple to PostGIS using the same library(ogr). I am using below link but it give me error. Import shp to Postgis using
Python and ogr

Error :

Traceback (most recent call last):

File "C:/Users/n/.qgis2/python/pluginsImporttoolImport_tool.py", line 223, in select_output_le_5

layer = shapele.GetLayer(0)

AttributeError: 'NoneType' object has no attribute 'GetLayer'


1 Reply Share

robson a month ago


Hi, how to display the elds in a table selected in a combo box in another combobox?
Reply Share

Manolis Panagiotakis a month ago


i did every step and at the end when i put line
self.dlg.lineEdit.clear()
self.dlg.pushButton.clicked.connect(self.select_output_le)

i have this error bellow


if i erase these lines it works again but when i put these lines it has problem

Reply Share

Ujaval Gandhi Mod > Manolis Panagiotakis a month ago


The error means self.dlg is not dened. Make sure you have put self.dlg = SaveAttributesDialog() in the __init__ method.
Reply Share

Manolis Panagiotakis > Ujaval Gandhi a month ago


i used it and it xed the error but after this i try to run the app and pushButton doesn't work
Reply Share

Mikhail Minin > Manolis Panagiotakis a month ago


you must also remove self.dlg = SaveAttributesDialog() from add_action method
Reply Share

Manolis Panagiotakis > Mikhail Minin a month ago


thank both of you for your help.
Reply Share

Sbastien Willis 5 months ago


Hi Ujaval

Thanks for the very helpful tutorials. I have a basic question: I can't display the .qgis2 folder when I search for a directory to install the plugin to
(step 3). I have tried changing the settings in the Terminal to display hidden folders, likewise I have tried selecting show hidden les when searching
in QGIS, both to no avail.

I suppose one solution would be to save the plugin to a visible folder in QGIS, then manually move it using the Terminal to ~/.qgis2/python/plugins,
but this seems silly. Is there no way to nd the .qgis2 folder directly?

I am using OS X Yosemite and QGIS 2.8.4. Any suggestions are appreciated!


Reply Share

Ujaval Gandhi Mod > Sbastien Willis 5 months ago


Ya this is strange. In 'Finder', you can use Cmd+Shift+G and type '.qgis2' manually to go to the folder. But it doesn't work via the le picker
in QGIS. As a workaround, I would keep the plugin in another folder and create a symbolic link to it in the .qgis2 folder via the terminal.
Reply Share

Axel Andersson 5 months ago


Thank you so much for this wonderful tutorial! I've made a couple of nice plugins after viewing this, I'm however stuck now in two dierent plugins
with a similar problem, is there anyway to use core functions of QGIS? In one plugin I want to create polygons from points, something that
Interpolation does perfectly but I would like my plugin to determine all the input for Interpolation plugin. In the other plugin I want to use the
heatmap plugin. I've mange to start the plugins from python code:

from PyQt4.QtGui import QAction


for item in qgis.utils.plugins['processing'].iface.rasterMenu().actions():
if "polation" in item.text():
item.menu().actions()[0].activate(QAction.Trigger)

But I have no clue how to nd the various elds (like the number of columns/row or where to store the le) in the Interpolation plugin.
Reply Share

Ujaval Gandhi Mod > Axel Andersson 5 months ago


Most core functions have SIP bindings that can be used by python code. What you are referring to are 'Core Plugins' which are not
accessible by python.

Instead - you can use Processing. There are equivalent processing algorithms that can be programmatically congured and run via python
http://gis.stackexchange.com/q...

btw, for interpolation - there is a Raster Interpolation python plugin that can be accessed via python
http://gis.stackexchange.com/q...
Reply Share

Axel Andersson > Ujaval Gandhi 5 months ago


Thanks a lot for the help, I nally gure it out!

import processing
GRASS_REGION_PARAMETER = '%f,%f,%f,%f'% (min_lon, max_lon, min_lat , max_lat)
processing.runandload("grass:v.voronoi", path_and_le_name_point,False, False, GRASS_REGION_PARAMETER, -1, 0, 3,
path_and_le_name_poly)

I had huge problems with getting the correct format for GRASS_REGION_PARAMETER. I had an extra space in the end which
resulted in that no polygon le were created ("= '%f, %f, %f, %f '%" etc. instead of "= '%f,%f,%f,%f'%" )

The only "problem" that remains now are that it takes rather long time to run the process with 100k+ points.
Reply Share

Ujaval Gandhi Mod > Axel Andersson 4 months ago


Good to know and thanks for sharing the correct syntax for the parameters.
Reply Share

Ooju, Oluwafemi Emmanuel 7 months ago


Hi All, I am new to plugin dev and I was given a task to develop a
plugin that can automatically update two eld in a table with timestamp
and also source with current timestamp and also the user name. Please
anyone with help its urgent.
Thanks
Reply Share
James Athersmith 10 months ago
Hi Ujaval,

Traceback (most recent call last):

File "C:/Users/AutoCad/.qgis2/python/pluginsSaveAttributessave_attributes.py", line 189, in select_output_le

self.dlg.lineEdit.setTest(lename)

AttributeError: 'QLineEdit' object has no attribute 'setTest'

Im getting the following error when I go to save a vector layer using the plugin.

My code is the same as yours at the end of the tutorial,

Any help would be greatly appreciated.


Reply Share

Ujaval Gandhi Mod > James Athersmith 8 months ago


The correct method name is setText - your code has setTest
Reply Share

Ashwin Bhayal a year ago


i want to develop "Print lay out functionality", but in output system is giving me whole image, I want to print only selected polygon. Also it is not
displaying label names on print image.

Please suggest some way.

from PyQt4.QtGui import *


from PyQt4.QtCore import *
import time
l = iface.activeLayer()
for a in l.getFeatures():
attrs = {16: 1}
l.dataProvider().changeAttributeValues({a.id(): attrs})
img = QImage(QSize(1280, 1024), QImage.Format_ARGB32_Premultiplied)
# set image's background color
color = QColor(255, 255, 255)
img.ll(color.rgb())
# create painter
p = QPainter()
p.begin(img)
see more

Reply Share

Ujaval Gandhi Mod > Ashwin Bhayal a year ago

replace rect = QgsRectangle(render.fullExtent()) with rect = layer.boundingBoxOfSelected()

Reply Share

Milton Isaya a year ago


Hi Ujaval Gandhi. Thanks for your helpful tutorial. I am pretty new to PyQis and I am having some trouble guring out on how I can use Python to
get the path of a layer loaded on QGis. I will also appreciate if you can assist me with some reliable resources relating to PyQGis plugin
development. I have gone through the cookbook but it gives less explanation relating to plugin development. Thank you one again.
Reply Share

Ujaval Gandhi Mod > Milton Isaya a year ago


For the path, see http://gis.stackexchange.com/q...

For general pyqgis resources, see my recommendations at http://www.qgistutorials.com/e...


Reply Share

Ashwin Bhayal a year ago


Hi Ujaval,
Below Question image.
Reply Share

Ashwin Bhayal a year ago


Hi Ujaval,

When we create new plugin in QGIS. So how


can I pass variable one module (impoarttool.py) to another module (Edit_from_B.py).

When I am trying to below code it will give


me error.

a.py

class A:

def run(self):

self.x = 20

b.py

from a import A

class B:
see more

Reply Share

Ashwin Bhayal a year ago


Hi Ujaval,

Thank you for providing very helpful tutorials

How can make sub menu of sub menu in QGIS. Please see below
image.

Can you explain me process?

Ok Thanks

Reply Share

Ujaval Gandhi Mod > Ashwin Bhayal a year ago


Intead of using

self.iface.addPluginToVectorMenu to add the items, get a reference to appropriate menu. For example webMenu = self.iface.webMenu() and
then add a sub-menu and actions in the standard QT way. http://stackoverow.com/quest...
Reply Share

Joakim Mrtensson > Ujaval Gandhi 7 months ago


Could you please expand on that answer?
For instance, I would like to create two seperate plugins using the plugin builder. These plugins are related, and it would be logical to
group them together under the same submenu.
group them together under the same submenu.
Surely there needs to be some code to check if the menu item has already been created etc...
Reply Share

Pablo Adrian Q a year ago


Hi!

I'm having problems in the step#7: When I try to run the 'make' command, I get the message:
" 'make' is not recognized as an internal or external command, operable program or batch le."

Any ideas on how can I solve this problem?

Some additional information:


I'm using Windows 8, 64 bits and a StandAlone installation.
QGIS version: 2.10.1
OSGeo4w: Installed with Express Desktop Install.
Python version: 2.7

Hope you can help me, and thanks!

*UPDATE*

Already solved the issue. The problem was that if you install QGIS, Python and Qt before installing OSGeo4w, you have to manually link all the
libraries between the programs. As an advice, download only OSGeo4w and select the Desktop Express Install, it will download QGIS, Python and
Qt (And some other things) and congure them automatically.

Still, it would be nice to include in this post how to link the libraries of QGIS, Python and Qt without having to reinstall them.
Reply Share

Ujaval Gandhi Mod > Pablo Adrian Q a year ago

Thanks Pablo Adrian Q for the feedback. Managing dependencies and linking them is dicult to do manually so best let the OSGeo4W
installer gure it out. I realized the need to make that more explicit while teaching a in-person workshop so created this
https://drive.google.com/le/...

I will incorporate this into this tutorial.


1 Reply Share

Pablo Adrian Q > Ujaval Gandhi a year ago


Thank you very much Ujaval. These tutorials have been a great help to learn how to develop plugins.
I don't know if this is the appropiate place to make a question, but I have been reading that there are dierences between commands
and syntaxis when using the Python console on QGIS and when writing a plugin. Is there any real dierence?
Reply Share

jobanpreet a year ago


My plugin reloader doesn't seem to work . I have to close qgis and open it again in order to reect changes in the SaveAttributes plugin . Any idea
why that might be happening?
Reply Share

Ujaval Gandhi Mod > jobanpreet a year ago


In plugin reloader, make sure you have chosen the corret plugin to be reloaded. Go to Plugins Plugin Reloader Choose a plugin to be
reloaded and select 'SaveAttributes'
Reply Share

Bubu Italia a year ago


Great Tutorial!
Beginner question: if I run several times the plugin, the combox shows an increasing list of shapeles, with the same le repeated one more time at
each launch.

My workaround was to add self.dlg.combBox.clear() before the comboBox.addItems() call.


Would you recommend another approach?

thanks again
Reply Share

Ujaval Gandhi Mod > Bubu Italia a year ago

@Bubu Italia Good catch. Your approach is the right way to handle this.
Reply Share

30plus > Ujaval Gandhi 21 days ago


I tried that x, but I still get the rst dataset in the QGIS TOC showing when I run the plugin. Any updates on how to x this
(aesthetic) issue?
Reply Share

GisLab a year ago


It is showing an error "Couldn't load plugin SaveAttributes1 due an error when calling its classFactory() method"
"IndentationError: unexpected indent".But i've already checked the spacing and its correct .
Reply Share

Ujaval Gandhi Mod > GisLab a year ago


Did you check Replace by space at Settings Preferences Tab Settings?
Reply Share

Micha Woga > Ujaval Gandhi a year ago


that's notepad++ problem.
Try to write this line in another editor
Reply Share

Danny Morck > Micha Woga a year ago


As Michal noticed - its a problem in Notepad ++. Maybe this should be mentioned in the tutorial. Thanks Ujaval.
Reply Share

Ujaval Gandhi Mod > Danny Morck a year ago

I have added a note in the 'Text Editor' section in the tutorial


Reply Share

Mark Percival a year ago


Hi Ujaval,

I've got as far as typimg 'make' but get the error: "make: *** No targets specied and no makele found. Stop."

I've got the latest QGIS and QT installed

Windows 7 Pro with full Admin access

I'm not sure where I go from here!

Mark
Reply Share

Ujaval Gandhi Mod > Mark Percival a year ago


run dir and see if there is a Makele in the current directory. Make sure you changed to the directory where the plugin was saved.
Reply Share

Mark Percival > Ujaval Gandhi a year ago


Ah! Didn't change to the folder. There is a Makele in the folder now along with a resources.qrc, _re.py etc.

Thank you.
Reply Share

Mark Percival > Mark Percival a year ago


I'm now getting the following error when I put the comboBox code into my py le!

Couldn't load plugin MultiStats due to an error when calling its classFactory() method

Traceback (most recent call last):


File "C:/OSGEO4~1/apps/qgis/./pythonqgisutils.py", line 219, in startPlugin
plugins[packageName] = package.classFactory(iface)
File "C:/Users/mpercival/.qgis2/python/pluginsMultiStats__init__.py", line 34, in classFactory
from .multistats import MultiStats

Вам также может понравиться