﻿{"id":16337,"date":"2026-05-20T10:00:00","date_gmt":"2026-05-20T08:00:00","guid":{"rendered":"https:\/\/www.sigterritoires.fr\/?p=16337"},"modified":"2026-05-18T11:17:02","modified_gmt":"2026-05-18T09:17:02","slug":"develop-qgis-plugin-why-how","status":"publish","type":"post","link":"https:\/\/www.sigterritoires.fr\/index.php\/en\/develop-qgis-plugin-why-how\/","title":{"rendered":"[EN]Developing a QGIS Plugin: Why and How to Create a Plugin"},"content":{"rendered":"\n<p>Developing a QGIS plugin may seem reserved for experienced programmers, but with the right approach, anyone can create their own. This tutorial explains why plugins are essential, what they can do, and how a plugin is structured, including the role of each file, making it accessible even for beginners.<\/p>\n\n\n\n<p>In this tutorial, we will explore what QGIS plugins are for, why they are so useful in everyday workflows, and especially how a QGIS plugin is structured: which files it contains and what their roles are.<\/p>\n\n\n\n<p>This series of articles is aimed at QGIS users who are beginners in Python, teachers, local government staff, and anyone who wants to automate their workflows or create tools tailored to their professional needs.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_83 counter-hierarchy ez-toc-counter ez-toc-light-blue ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Contenu <\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.sigterritoires.fr\/index.php\/en\/develop-qgis-plugin-why-how\/#Introduction\" >Introduction<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.sigterritoires.fr\/index.php\/en\/develop-qgis-plugin-why-how\/#Why_Develop_Your_Own_QGIS_Plugins\" >Why Develop Your Own QGIS Plugins?<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.sigterritoires.fr\/index.php\/en\/develop-qgis-plugin-why-how\/#Automate_Repetitive_Tasks\" >Automate Repetitive Tasks<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.sigterritoires.fr\/index.php\/en\/develop-qgis-plugin-why-how\/#Adapt_QGIS_to_Your_Workflow\" >Adapt QGIS to Your Workflow<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.sigterritoires.fr\/index.php\/en\/develop-qgis-plugin-why-how\/#Learn_Programming_Gradually\" >Learn Programming Gradually<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.sigterritoires.fr\/index.php\/en\/develop-qgis-plugin-why-how\/#Share_or_Keep_for_Yourself\" >Share (or Keep for Yourself)<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.sigterritoires.fr\/index.php\/en\/develop-qgis-plugin-why-how\/#What_Does_a_QGIS_Plugin_Consist_Of\" >What Does a QGIS Plugin Consist Of?<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.sigterritoires.fr\/index.php\/en\/develop-qgis-plugin-why-how\/#The_init_py_File\" >The __init__.py File<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.sigterritoires.fr\/index.php\/en\/develop-qgis-plugin-why-how\/#Line-by-Line_Explanation\" >Line-by-Line Explanation<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.sigterritoires.fr\/index.php\/en\/develop-qgis-plugin-why-how\/#Summary\" >Summary<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.sigterritoires.fr\/index.php\/en\/develop-qgis-plugin-why-how\/#The_metadatatxt_File\" >The metadata.txt File<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/www.sigterritoires.fr\/index.php\/en\/develop-qgis-plugin-why-how\/#The_Main_Python_File_eg_my_pluginpy\" >The Main Python File (e.g., my_plugin.py)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/www.sigterritoires.fr\/index.php\/en\/develop-qgis-plugin-why-how\/#Optional_but_Common_Files\" >Optional but Common Files<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/www.sigterritoires.fr\/index.php\/en\/develop-qgis-plugin-why-how\/#Graphical_Interfaces_ui\" >Graphical Interfaces (.ui)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/www.sigterritoires.fr\/index.php\/en\/develop-qgis-plugin-why-how\/#Resources_resourcesqrc\" >Resources (resources.qrc)<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/www.sigterritoires.fr\/index.php\/en\/develop-qgis-plugin-why-how\/#What_You_Need_to_Remember_for_Now\" >What You Need to Remember for Now<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/www.sigterritoires.fr\/index.php\/en\/develop-qgis-plugin-why-how\/#Whats_Next\" >What\u2019s Next?<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Introduction\"><\/span>Introduction<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>QGIS is today one of the most widely used open-source GIS platforms in the world. Its functional richness is impressive, but what really makes it powerful is its <strong>extensibility through plugins<\/strong>.<\/p>\n\n\n\n<p>A QGIS plugin allows you to add custom features: automate repetitive tasks, create tools adapted to a specific profession, test new methods, or simply make daily work easier.<\/p>\n\n\n\n<p>This tutorial is intentionally aimed at people with <strong>limited programming experience<\/strong>. It does not aim to make you a Python expert but to give you the foundations to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>understand how a QGIS plugin works,<\/li>\n\n\n\n<li>modify an existing plugin,<\/li>\n\n\n\n<li>create your own simple and useful tools.<\/li>\n<\/ul>\n\n\n\n<p>The goal is to learn <strong>just enough Python and QGIS architecture<\/strong> to become autonomous.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Why_Develop_Your_Own_QGIS_Plugins\"><\/span>Why Develop Your Own QGIS Plugins?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Automate_Repetitive_Tasks\"><\/span>Automate Repetitive Tasks<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>If you use QGIS often, you have probably repeated the same steps several times:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>loading layers,<\/li>\n\n\n\n<li>applying styles,<\/li>\n\n\n\n<li>running a series of processes,<\/li>\n\n\n\n<li>exporting results.<\/li>\n<\/ul>\n\n\n\n<p>A plugin can group these actions under <strong>a single button<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Adapt_QGIS_to_Your_Workflow\"><\/span>Adapt QGIS to Your Workflow<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>The needs of a GIS professional, teacher, government agent, or researcher are not always covered by standard tools. A plugin can integrate:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>business rules,<\/li>\n\n\n\n<li>consistency checks,<\/li>\n\n\n\n<li>specific calculations.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Learn_Programming_Gradually\"><\/span>Learn Programming Gradually<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Developing a QGIS plugin is an excellent way to get started with Python:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>the results are concrete and visual,<\/li>\n\n\n\n<li>errors are often easy to identify,<\/li>\n\n\n\n<li>progress can be made in small, manageable steps.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Share_or_Keep_for_Yourself\"><\/span>Share (or Keep for Yourself)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>A plugin can remain strictly personal, be shared within a team, or be published publicly through the official QGIS repository.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"What_Does_a_QGIS_Plugin_Consist_Of\"><\/span>What Does a QGIS Plugin Consist Of?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>A QGIS plugin is primarily a <strong>folder containing several files<\/strong>, each with a specific role. The good news: you do not need to understand everything in depth right away.<\/p>\n\n\n\n<p>Here\u2019s the <strong>minimal structure of a plugin<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MyPlugin\/\n\u251c\u2500\u2500 __init__.py\n\u251c\u2500\u2500 metadata.txt\n\u251c\u2500\u2500 my_plugin.py\n\u2514\u2500\u2500 resources.qrc (optional)\n<\/code><\/pre>\n\n\n\n<p>We will go through these files one by one.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"The_init_py_File\"><\/span>The <code>__init__.py<\/code> File<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>This is the <strong>entry point of the plugin<\/strong>.<\/p>\n\n\n\n<p>Its main role is to tell QGIS which Python class should be loaded when the plugin is activated.<\/p>\n\n\n\n<p>Simplified example:<\/p>\n\n\n<div class='stb-container stb-style-black'><div class='stb-caption'><div class='stb-logo'><img class='stb-logo__image' src='data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN\/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz\/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH\/w\/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA\/g88wAAKCRFRHgg\/P9eM4Ors7ONo62Dl8t6r8G\/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt\/qIl7gRoXgugdfeLZrIPQLUAoOnaV\/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl\/AV\/1s+X48\/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H\/LcL\/\/wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93\/+8\/\/UegJQCAZkmScQAAXkQkLlTKsz\/HCAAARKCBKrBBG\/TBGCzABhzBBdzBC\/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD\/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q\/pH5Z\/YkGWcNMw09DpFGgsV\/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY\/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4\/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L\/1U\/W36p\/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N\/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26\/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE\/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV\/MN8C3yLfLT8Nvnl+F30N\/I\/9k\/3r\/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt\/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi\/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a\/zYnKOZarnivN7cyzytuQN5zvn\/\/tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO\/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3\/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA\/0HIw6217nU1R3SPVRSj9Yr60cOxx++\/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3\/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX\/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8\/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb\/1tWeOT3dvfN6b\/fF9\/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR\/cGhYPP\/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF\/6i\/suuFxYvfvjV69fO0ZjRoZfyl5O\/bXyl\/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o\/2j5sfVT0Kf7kxmTk\/8EA5jz\/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5\/wAAgOkAAHUwAADqYAAAOpgAABdvkl\/FRgAAD59JREFUeNrsmnmMXVd9xz9nucvbZvF4GdtjO46dhcRZSGmCSIAExaUFQtoiUVSgFFQBFaISRaBSoH9QVaUUAU2VSrSVoGELSgRpGshCA8GQYGfBcVZsx47j2dc3M2\/ee3c55\/z6xxubpOSPCSX8QXOkq3ve1ZXO+dzfcr7nd54SEX4TmuY3pL0E8hLIi9Ts8z08Ojr3nN9iAgklzdl54iRBCBROcXx8kTgynBxvcuN3D\/Lk0TFtrNmiQrHnA++48qz3vu2KM0VYd\/jYhPrAJ77cHptenqrV0hNac9gH\/Wi73W5bLbz7rZdx9Wv2MDk+RV4UVBoNQhkofUHaV0fCcxPSu669dm0gL8ikWmGtGWy3O+dqFa48d9vQqx99\/MQF01NLGwb6BxJr4fYfPs7iYhcdPCHrLjsJY319tf22kd7T7XR+EkROAO5XbpG1tCBCCNKfZcXe8cmFd1SMvOmc7ZvM7p0jHBltc9UVF9PJFV\/6+r185ZYHGN52Jko8zeZS39z84nl7zt1x3puvPv89N912YEwr\/Q3vw80hhPt\/rSAhBKpJcvnWTYMfuuk7D72FIFz3qXdzbLTJR\/\/pLuKBjdz+4CS3PTDOTXc+QiWJ2LqxD18UlBFs3taHTgZptiPqfUMj3Ux9RIL+k1q9fn2z2fxXYPrFBxHB2uj9Q+v6\/nrThnjbKy85h0svOoPtm4dYLhUbRraw2HV85+FJlFZsP+cMNNDOcogNpi\/ionPWc8bGKnf++Dg7tqznlZeMMDDQtymtJJ8S1Ou8hL8KhAMvGohI0Cay\/1BvND6YJpWkXqtxzesu4Mb\/Psz9Nx1i64YGjeF1dLolmyINSqGCICFgfRUpPT4rObrgIPZ86M9ex3lnrCNNYWx6AQ3U+\/quHB2b+lpfLf3L0he3\/upBRFSSVv+5Uq38eb1SUY16leVOyT9+8yHufGQSSSyPtT1FJaVSq6KNQikFBIIP4DziPFFW0ml1mex45tqeTUMNjo3P8eRTTepVTSWJue\/A47sG+tMvXnjBrkQrfVPQYXUS6v8ColBKqXaWfyatpO+vVaqqUU1ZWMr47Lce4ZsPjlMdqFFppGSRIUpiImvQSvXGDYHECN55sszh05xKYnnv3nO45pLtPDOzxF987kfY4HnDq7bS6XaoN\/pR2g0rrT7\/zDMnl7NW985IB2A1DV9zzdpAQvDPwcha7fdFJnywWkl1f73Ccjfw8Rse5LYnptk0Moitppg0xiYRylq0VSilQQkEQYtQ1SK6k6si15SR5Ws\/HaUQGK4Y9l6+i6KbMT7f4a59T7E8d5wdm2NqtXRrrW4\/7Z0fVbgnRIUXZhHXnkQpCEFotctLa7X6RwcHBpO+WoX5VsGnbz7E3cfn2bx9iKiWYqopNo3RscVEEUor0KrnCOIpCw8aUqMRoxBtGG91mG3nvPW3d\/F7l2ymcCUHD0+ysNjmwANzHD4+yuzcAm97y+UXp\/XKJ4vW8p9ao3PU87uXej4Zf\/2X\/xMfAo1aXL3wZVu+UvroD\/c\/OsMr9uzglgcmuOngBBu3rcM2qkTV9LRFTGyJkghR+ufjBY+4gCtLQlmiypKaBM4aiPnkVbuppxGtlQ7dLMP7AudKHnjsaZqLy0xOT9NaaeGkIJLyXaEovhIQ+eyn\/nZtFvnYF+6m0y15+XnDr7\/u42988w23Psm\/33aYN77+YprKsmFzP1E1wVZibDUmqsSYNMEkEcYa0KBYDXYREecxRqtgFDnIpprh46\/doeqJoSwd1hisMRQltHPHzpF1bFhXYXhTnbt\/dJCJySZbhvs+stBc\/J4ry8k1i8ZaAoMN07hw99B7Dj05a2\/dd4zLf+tMrnrFDtZvqJNbgyQRNo2wadyLjzTCxhZtNFpptFYorUgiEyppJDqJeq4XW3X59n7VV4lwLpxORkortNYoFHnh6WYlWV5y7lkjWGOYXWjtiZJ0b5Skas0g3SzDqnD+xsHK74gyXHnpLqr9NbpeuOjMIX53zzCNaoSJLcZaTGTQ0erkFav3Xox4Ee0VykYaYy1RZHnZUK2X0f+XvysUIoJWGqM1BEjThN1nbqHV6pI5eZcytrpmkLN3btJFKVdNzXbivVfs5FWXbOPEbIcb95\/kwdFFFgpPmkRoazBWY6zBaIM+DcFqvzc7AaV1710HHJzrnF4V1LNgRAmIoFTvudYaVwaGhvqIraGbla\/RqB1rBumrJVsaib3yth88zZdufozLzh\/mrB2DLBWek8sZj8ys0CwDohRaK7QCo1atoBT6WXetFEYrdG+hR2mIrH7u4hYEEQheCNLrA6c\/iHeBXbtHWGq27A\/2PX75mtNvu1NcGLzsUTriq7cfYaG0GKu5+oJh\/uCKM5npeh5e6HKsK3R9oL66UD37657qqtVr9Q1io7nr5DIXDibh5Rsb2jlHQABBIygBQRCRU8sfPgTi2DI42GCpefjlawYps3y3c7I+rcY4rzg23uKP33Qer71ohJ3Dg73PGjzfG13mxqdXmCgDKgrE2vyCiNCnbO4EJQGNsJCV\/NfTTT1Sj9lQjdCiyfPAUidHGcEahQ+ChJ6FAPK8ZHjLRrZsXb99zSBTUwu7RKWxUoZaJeaho002PzzNta88g6IoUNqitWLvjn4u3lDjtrE2t8\/kOK9IIv2s4F31\/RAQ7xDvIQRSA\/vGFhmbX+GanQPUDDxxdJYfHjjBxTtqXLSzThIHfPCE4PG+FzvOOdrtzvo1g+RlWG8ji9IGUFRjQyO1dPKCOOoFLWhCEDZUI959dj\/dsMQtE13iJKJiNbHpZa3gheAd4jwSAoSeZkq14sh8m78fXUA6npUTc7Snltj\/03HeuXcrey9dj\/ehdwVPEMG7QNbN62sXjX5Fi7WI9OODkEQRl501QGyEbl4SiyKJY4zWeBdQGi5dFyMIjy2VLDrPYiYkBhIFwQckeCQ4vHeIc0jpSEQwSpN1utjS01+JaHtP4XvS3zmP8wHnHKherAQRvWaQUE5nSpZwJicrhxiuj7BlncV5hy\/l55kpijBGEzycP5Bw0VDKTNezWHoems+5Z7pDy3m0BMR7gu+5SnC9S7xAIYTlHApP8AGDZ\/+hCc7bZkjiQFmWlM5hjGFqYoaVpaV87SAhn1AevFtBqZj52SmeODbFzpF+NEJe9NKnCMRRhDWKVPf01daaZSuWc\/tTtieKv9s\/BsGjvcc7TyhKQubwWYlkjmxukWx2npAVhDLD5V2enmlx4GHHay\/bTlGWpy1SZCW+LBfXDCKBY6KlLd7V4jSQ5wXfvOMJ9py1iR3DgxRFcWrHSJBAbC3amOesH8ZoWq2M5swSqRKU94TCIXlJyD1SONxKl2xmFp93CWWJ+Jzgc5R3tDs5RVGSFwVBAqDIiwJt7PQLsEj5Mx30uEh5dnAFlUrg6IkZjpyYY9vGBi4EUD054UXwIWC1xhiDUQprNHcdnubz9xxDZyUKIZSBUPYAxHlCt6RoNnF5hlVQrVraKzlOhCjSbByq0O50KZ0DFGXpmJqaR+DwmkGMsY8GCQeCL84WlyG+ACLuO3iSi8\/ZSH+9QhaEEHoZxTuPtbonU7QmNoZ7j0wxNr7IhmqM855QBsR5KAOhdD2I9gpKAt47Mi8ECXgX2DbcYOf2AZbaHXwIaK1YWlrBRhak+Mnas1ZwLRG5W7x7p\/cZynVIk4Tv7z+OF817rr2ATevr5CEQQoTXntJprLGksSEoj1vJ0Z0cJwFxq\/v2AFJ6yuVFytZyb30JHgm+l81Cz1V3bu1DESjyAq2htZLxzMlpnA8zutL3yJq1lpICI+V9oWjPBl8QXAcJXbTk3PHjo9xx33FEHN08J8tzsrwgywoIJZ0s4+v7jrPv0AQV73HtHN8tkMwTugVFc4FyebGXxcSDBE6JK1GgDDRXurS7GS54tNaMjs8xt7DM0nLrWyLMrtkiShlQ8gzivhpc8aFQZnizglWW1Gh++vg4b7hiB2kS4XwgspZqGrHv0Czff3iGnxxZIAhUYk0vnAx4T7GySJmt9MYIAUVACIgKBNWzjIhneaVLN8vxzrO80ub4yRlOjk64bH7sG6EsyzWDaG0BCh\/CjS5vv01ruzmYDkFbEMXs3ALziysMDVTRyuFtRBwJ37nvGX5wcIb+WkwUWUoXUNogoUPZXiSU2bMEbwB6VhHxq0AeE2nQUDqH4JlvtphdyOm285vLlYUD4oq1Fx867cXVNOwfUjb9N2OTv1FaoTCIh9YSjE7O0VfbjHMFA32KsekuE9OLVG1Ai8M7UFrjshY+W0a862lyAcEhEnpVllV5rNCgVneYRoN4jo8ucf+jC3TbxYRV4QtOmxyl1w4S\/CnrKe87zeuVhFcrM3yViEYHYcWXHH5qgl3bhxARxmcLbrrrGCdGF4jihOAEKPHFCr7soJRCUIgLQOjt6bXuSWP9XKGPBLSJuPfRJU6Md2h1Db7sfM5Lfn+0buR0PK0ta52i7m3VZspO8xMmqvyHTWW3IIgrmZiepZN1cWXg8afmeezIBL4EqwNlURKKDiIepQ1B9SaI0ihrfg5gev1ToAjg4ampgMs1hDq+eeSGfPnp6021f3XHpdYOctoPFUhwEMJ9WWvqw6nwRVthOOA59MgRXnHRDvobdb59x0Hml0rq9Qr5coEEhzYWpTTBF70al7Eos1p91Aqs6YEoiyjTS6C+Fx\/agLWK7twTd2ULRz+m4yh71uzWDlK2pn6hbCriblW9Ea8zSWNkbnqW7975AG\/5\/SvYOGiYHB8j8xHKxChtkeAQQFmDMRGo0JvsqiVEW5SOQEUoFSGsQolBjCZfPnJX0TrxXqWjCQi\/ZBH7eQJKKYvP298ubXM5iPucjuoXPv7okwytS+iraiLpIC5FCChvwGiiJAGjCMGhTG\/VRxvQFqViRKUok4CJCSZC4hrBefLxR25wnZMfVTpe8znJCzsfURqUvtt1l\/5Il9knlK28\/d59D9I\/2I9WAe8ygit6ApIERW9j5kShYbUebIEYpSpgKoS0BtUGqjGAa05N5RMHPlPOP\/0v2jTyF\/WgR6EQpX7m85X3aV\/ekRXZh\/MsvzipVNHWYuIY5xxaCWXZqx+b2BKCweURVmKgjsR9qL4BosF1BAvFxGPfkPbKdeXcU\/uVTn9dZ4gKlGoH774quHs2rq9fneWdtxeFeU21Fsfbt2yg3S2YWchRcYwyhjS2NBqWjq+QNCxxwyN6diZ65vu3LPbt\/np7Zemg8WpZ2WQtIfErPtXtlezHrOHL2vCt9uzkSL0irxqsb7pkpdU5o56Y9VhbGxoweudIcJFeWGqtzEy6vH20ODl\/f27qDymTzKqklWFiCL\/8wa566U81L4G8BPL\/A+R\/BgAzCInEE2+\/LgAAAABJRU5ErkJggg==' alt='img'\/><\/div><div class='stb-caption-content'><\/div><div class='stb-tool'><\/div><\/div><div class='stb-content'><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def classFactory(iface):\n    from .my_plugin import MyPlugin\n    return MyPlugin(iface)\n<\/code><\/pre>\n\n\n<p><\/div><\/div>\n\n\n\n<p>At this stage, remember that:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>this file is <strong>mandatory<\/strong>,<\/li>\n\n\n\n<li>it <strong>links QGIS to your main code<\/strong>.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Line-by-Line_Explanation\"><\/span>Line-by-Line Explanation<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>1&#xfe0f;&#x20e3; <code>def classFactory(iface):<\/code><\/p>\n\n\n\n<p>&#x2714; QGIS <strong>requires<\/strong> a function with this exact name: <code>classFactory<\/code>.<\/p>\n\n\n\n<p>When QGIS loads your plugin, it automatically calls:<\/p>\n\n\n<div class='stb-container stb-style-black'><div class='stb-caption'><div class='stb-logo'><img class='stb-logo__image' src='data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN\/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz\/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH\/w\/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA\/g88wAAKCRFRHgg\/P9eM4Ors7ONo62Dl8t6r8G\/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt\/qIl7gRoXgugdfeLZrIPQLUAoOnaV\/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl\/AV\/1s+X48\/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H\/LcL\/\/wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93\/+8\/\/UegJQCAZkmScQAAXkQkLlTKsz\/HCAAARKCBKrBBG\/TBGCzABhzBBdzBC\/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD\/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q\/pH5Z\/YkGWcNMw09DpFGgsV\/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY\/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4\/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L\/1U\/W36p\/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N\/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26\/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE\/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV\/MN8C3yLfLT8Nvnl+F30N\/I\/9k\/3r\/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt\/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi\/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a\/zYnKOZarnivN7cyzytuQN5zvn\/\/tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO\/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3\/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA\/0HIw6217nU1R3SPVRSj9Yr60cOxx++\/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3\/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX\/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8\/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb\/1tWeOT3dvfN6b\/fF9\/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR\/cGhYPP\/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF\/6i\/suuFxYvfvjV69fO0ZjRoZfyl5O\/bXyl\/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o\/2j5sfVT0Kf7kxmTk\/8EA5jz\/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5\/wAAgOkAAHUwAADqYAAAOpgAABdvkl\/FRgAAD59JREFUeNrsmnmMXVd9xz9nucvbZvF4GdtjO46dhcRZSGmCSIAExaUFQtoiUVSgFFQBFaISRaBSoH9QVaUUAU2VSrSVoGELSgRpGshCA8GQYGfBcVZsx47j2dc3M2\/ee3c55\/z6xxubpOSPCSX8QXOkq3ve1ZXO+dzfcr7nd54SEX4TmuY3pL0E8hLIi9Ts8z08Ojr3nN9iAgklzdl54iRBCBROcXx8kTgynBxvcuN3D\/Lk0TFtrNmiQrHnA++48qz3vu2KM0VYd\/jYhPrAJ77cHptenqrV0hNac9gH\/Wi73W5bLbz7rZdx9Wv2MDk+RV4UVBoNQhkofUHaV0fCcxPSu669dm0gL8ikWmGtGWy3O+dqFa48d9vQqx99\/MQF01NLGwb6BxJr4fYfPs7iYhcdPCHrLjsJY319tf22kd7T7XR+EkROAO5XbpG1tCBCCNKfZcXe8cmFd1SMvOmc7ZvM7p0jHBltc9UVF9PJFV\/6+r185ZYHGN52Jko8zeZS39z84nl7zt1x3puvPv89N912YEwr\/Q3vw80hhPt\/rSAhBKpJcvnWTYMfuuk7D72FIFz3qXdzbLTJR\/\/pLuKBjdz+4CS3PTDOTXc+QiWJ2LqxD18UlBFs3taHTgZptiPqfUMj3Ux9RIL+k1q9fn2z2fxXYPrFBxHB2uj9Q+v6\/nrThnjbKy85h0svOoPtm4dYLhUbRraw2HV85+FJlFZsP+cMNNDOcogNpi\/ionPWc8bGKnf++Dg7tqznlZeMMDDQtymtJJ8S1Ou8hL8KhAMvGohI0Cay\/1BvND6YJpWkXqtxzesu4Mb\/Psz9Nx1i64YGjeF1dLolmyINSqGCICFgfRUpPT4rObrgIPZ86M9ex3lnrCNNYWx6AQ3U+\/quHB2b+lpfLf3L0he3\/upBRFSSVv+5Uq38eb1SUY16leVOyT9+8yHufGQSSSyPtT1FJaVSq6KNQikFBIIP4DziPFFW0ml1mex45tqeTUMNjo3P8eRTTepVTSWJue\/A47sG+tMvXnjBrkQrfVPQYXUS6v8ColBKqXaWfyatpO+vVaqqUU1ZWMr47Lce4ZsPjlMdqFFppGSRIUpiImvQSvXGDYHECN55sszh05xKYnnv3nO45pLtPDOzxF987kfY4HnDq7bS6XaoN\/pR2g0rrT7\/zDMnl7NW985IB2A1DV9zzdpAQvDPwcha7fdFJnywWkl1f73Ccjfw8Rse5LYnptk0Moitppg0xiYRylq0VSilQQkEQYtQ1SK6k6si15SR5Ws\/HaUQGK4Y9l6+i6KbMT7f4a59T7E8d5wdm2NqtXRrrW4\/7Z0fVbgnRIUXZhHXnkQpCEFotctLa7X6RwcHBpO+WoX5VsGnbz7E3cfn2bx9iKiWYqopNo3RscVEEUor0KrnCOIpCw8aUqMRoxBtGG91mG3nvPW3d\/F7l2ymcCUHD0+ysNjmwANzHD4+yuzcAm97y+UXp\/XKJ4vW8p9ao3PU87uXej4Zf\/2X\/xMfAo1aXL3wZVu+UvroD\/c\/OsMr9uzglgcmuOngBBu3rcM2qkTV9LRFTGyJkghR+ufjBY+4gCtLQlmiypKaBM4aiPnkVbuppxGtlQ7dLMP7AudKHnjsaZqLy0xOT9NaaeGkIJLyXaEovhIQ+eyn\/nZtFvnYF+6m0y15+XnDr7\/u42988w23Psm\/33aYN77+YprKsmFzP1E1wVZibDUmqsSYNMEkEcYa0KBYDXYREecxRqtgFDnIpprh46\/doeqJoSwd1hisMRQltHPHzpF1bFhXYXhTnbt\/dJCJySZbhvs+stBc\/J4ry8k1i8ZaAoMN07hw99B7Dj05a2\/dd4zLf+tMrnrFDtZvqJNbgyQRNo2wadyLjzTCxhZtNFpptFYorUgiEyppJDqJeq4XW3X59n7VV4lwLpxORkortNYoFHnh6WYlWV5y7lkjWGOYXWjtiZJ0b5Skas0g3SzDqnD+xsHK74gyXHnpLqr9NbpeuOjMIX53zzCNaoSJLcZaTGTQ0erkFav3Xox4Ee0VykYaYy1RZHnZUK2X0f+XvysUIoJWGqM1BEjThN1nbqHV6pI5eZcytrpmkLN3btJFKVdNzXbivVfs5FWXbOPEbIcb95\/kwdFFFgpPmkRoazBWY6zBaIM+DcFqvzc7AaV1710HHJzrnF4V1LNgRAmIoFTvudYaVwaGhvqIraGbla\/RqB1rBumrJVsaib3yth88zZdufozLzh\/mrB2DLBWek8sZj8ys0CwDohRaK7QCo1atoBT6WXetFEYrdG+hR2mIrH7u4hYEEQheCNLrA6c\/iHeBXbtHWGq27A\/2PX75mtNvu1NcGLzsUTriq7cfYaG0GKu5+oJh\/uCKM5npeh5e6HKsK3R9oL66UD37657qqtVr9Q1io7nr5DIXDibh5Rsb2jlHQABBIygBQRCRU8sfPgTi2DI42GCpefjlawYps3y3c7I+rcY4rzg23uKP33Qer71ohJ3Dg73PGjzfG13mxqdXmCgDKgrE2vyCiNCnbO4EJQGNsJCV\/NfTTT1Sj9lQjdCiyfPAUidHGcEahQ+ChJ6FAPK8ZHjLRrZsXb99zSBTUwu7RKWxUoZaJeaho002PzzNta88g6IoUNqitWLvjn4u3lDjtrE2t8\/kOK9IIv2s4F31\/RAQ7xDvIQRSA\/vGFhmbX+GanQPUDDxxdJYfHjjBxTtqXLSzThIHfPCE4PG+FzvOOdrtzvo1g+RlWG8ji9IGUFRjQyO1dPKCOOoFLWhCEDZUI959dj\/dsMQtE13iJKJiNbHpZa3gheAd4jwSAoSeZkq14sh8m78fXUA6npUTc7Snltj\/03HeuXcrey9dj\/ehdwVPEMG7QNbN62sXjX5Fi7WI9OODkEQRl501QGyEbl4SiyKJY4zWeBdQGi5dFyMIjy2VLDrPYiYkBhIFwQckeCQ4vHeIc0jpSEQwSpN1utjS01+JaHtP4XvS3zmP8wHnHKherAQRvWaQUE5nSpZwJicrhxiuj7BlncV5hy\/l55kpijBGEzycP5Bw0VDKTNezWHoems+5Z7pDy3m0BMR7gu+5SnC9S7xAIYTlHApP8AGDZ\/+hCc7bZkjiQFmWlM5hjGFqYoaVpaV87SAhn1AevFtBqZj52SmeODbFzpF+NEJe9NKnCMRRhDWKVPf01daaZSuWc\/tTtieKv9s\/BsGjvcc7TyhKQubwWYlkjmxukWx2npAVhDLD5V2enmlx4GHHay\/bTlGWpy1SZCW+LBfXDCKBY6KlLd7V4jSQ5wXfvOMJ9py1iR3DgxRFcWrHSJBAbC3amOesH8ZoWq2M5swSqRKU94TCIXlJyD1SONxKl2xmFp93CWWJ+Jzgc5R3tDs5RVGSFwVBAqDIiwJt7PQLsEj5Mx30uEh5dnAFlUrg6IkZjpyYY9vGBi4EUD054UXwIWC1xhiDUQprNHcdnubz9xxDZyUKIZSBUPYAxHlCt6RoNnF5hlVQrVraKzlOhCjSbByq0O50KZ0DFGXpmJqaR+DwmkGMsY8GCQeCL84WlyG+ACLuO3iSi8\/ZSH+9QhaEEHoZxTuPtbonU7QmNoZ7j0wxNr7IhmqM855QBsR5KAOhdD2I9gpKAt47Mi8ECXgX2DbcYOf2AZbaHXwIaK1YWlrBRhak+Mnas1ZwLRG5W7x7p\/cZynVIk4Tv7z+OF817rr2ATevr5CEQQoTXntJprLGksSEoj1vJ0Z0cJwFxq\/v2AFJ6yuVFytZyb30JHgm+l81Cz1V3bu1DESjyAq2htZLxzMlpnA8zutL3yJq1lpICI+V9oWjPBl8QXAcJXbTk3PHjo9xx33FEHN08J8tzsrwgywoIJZ0s4+v7jrPv0AQV73HtHN8tkMwTugVFc4FyebGXxcSDBE6JK1GgDDRXurS7GS54tNaMjs8xt7DM0nLrWyLMrtkiShlQ8gzivhpc8aFQZnizglWW1Gh++vg4b7hiB2kS4XwgspZqGrHv0Czff3iGnxxZIAhUYk0vnAx4T7GySJmt9MYIAUVACIgKBNWzjIhneaVLN8vxzrO80ub4yRlOjk64bH7sG6EsyzWDaG0BCh\/CjS5vv01ruzmYDkFbEMXs3ALziysMDVTRyuFtRBwJ37nvGX5wcIb+WkwUWUoXUNogoUPZXiSU2bMEbwB6VhHxq0AeE2nQUDqH4JlvtphdyOm285vLlYUD4oq1Fx867cXVNOwfUjb9N2OTv1FaoTCIh9YSjE7O0VfbjHMFA32KsekuE9OLVG1Ai8M7UFrjshY+W0a862lyAcEhEnpVllV5rNCgVneYRoN4jo8ucf+jC3TbxYRV4QtOmxyl1w4S\/CnrKe87zeuVhFcrM3yViEYHYcWXHH5qgl3bhxARxmcLbrrrGCdGF4jihOAEKPHFCr7soJRCUIgLQOjt6bXuSWP9XKGPBLSJuPfRJU6Md2h1Db7sfM5Lfn+0buR0PK0ta52i7m3VZspO8xMmqvyHTWW3IIgrmZiepZN1cWXg8afmeezIBL4EqwNlURKKDiIepQ1B9SaI0ihrfg5gev1ToAjg4ampgMs1hDq+eeSGfPnp6021f3XHpdYOctoPFUhwEMJ9WWvqw6nwRVthOOA59MgRXnHRDvobdb59x0Hml0rq9Qr5coEEhzYWpTTBF70al7Eos1p91Aqs6YEoiyjTS6C+Fx\/agLWK7twTd2ULRz+m4yh71uzWDlK2pn6hbCriblW9Ea8zSWNkbnqW7975AG\/5\/SvYOGiYHB8j8xHKxChtkeAQQFmDMRGo0JvsqiVEW5SOQEUoFSGsQolBjCZfPnJX0TrxXqWjCQi\/ZBH7eQJKKYvP298ubXM5iPucjuoXPv7okwytS+iraiLpIC5FCChvwGiiJAGjCMGhTG\/VRxvQFqViRKUok4CJCSZC4hrBefLxR25wnZMfVTpe8znJCzsfURqUvtt1l\/5Il9knlK28\/d59D9I\/2I9WAe8ygit6ApIERW9j5kShYbUebIEYpSpgKoS0BtUGqjGAa05N5RMHPlPOP\/0v2jTyF\/WgR6EQpX7m85X3aV\/ekRXZh\/MsvzipVNHWYuIY5xxaCWXZqx+b2BKCweURVmKgjsR9qL4BosF1BAvFxGPfkPbKdeXcU\/uVTn9dZ4gKlGoH774quHs2rq9fneWdtxeFeU21Fsfbt2yg3S2YWchRcYwyhjS2NBqWjq+QNCxxwyN6diZ65vu3LPbt\/np7Zemg8WpZ2WQtIfErPtXtlezHrOHL2vCt9uzkSL0irxqsb7pkpdU5o56Y9VhbGxoweudIcJFeWGqtzEy6vH20ODl\/f27qDymTzKqklWFiCL\/8wa566U81L4G8BPL\/A+R\/BgAzCInEE2+\/LgAAAABJRU5ErkJggg==' alt='img'\/><\/div><div class='stb-caption-content'><\/div><div class='stb-tool'><\/div><\/div><div class='stb-content'><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>classFactory(iface)\n<\/code><\/pre>\n\n\n<p><\/div><\/div>\n\n\n\n<p>and passes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>iface<\/code> = the QGIS interface object (<code>QgisInterface<\/code>)<\/li>\n<\/ul>\n\n\n\n<p>This object gives access to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>the map canvas,<\/li>\n\n\n\n<li>the Plugins menu,<\/li>\n\n\n\n<li>the toolbar,<\/li>\n\n\n\n<li>the active layer,<\/li>\n\n\n\n<li>messages\/logs,<\/li>\n\n\n\n<li>etc.<\/li>\n<\/ul>\n\n\n\n<p>&#x27a1;&#xfe0f; This is the central object that allows a plugin to interact with QGIS.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>2&#xfe0f;&#x20e3; <code>from .my_plugin import MyPlugin<\/code><\/p>\n\n\n\n<p>The dot (<code>.<\/code>) means: \u00ab\u00a0from the same folder as this file\u00a0\u00bb.<\/p>\n\n\n\n<p>QGIS loads the main class from:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>my_plugin.py\n<\/code><\/pre>\n\n\n\n<p>This class contains:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>initGui()<\/code> \u2192 adds actions, menus, icons<\/li>\n\n\n\n<li><code>unload()<\/code> \u2192 removes plugin elements<\/li>\n\n\n\n<li>business functions (tool activation, window display, etc.)<\/li>\n<\/ul>\n\n\n\n<p>&#x27a1;&#xfe0f; This is the <strong>root class<\/strong> of the plugin, controlling everything.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>3&#xfe0f;&#x20e3; <code>return MyPlugin(iface)<\/code><\/p>\n\n\n\n<p>QGIS expects an <strong>instance<\/strong> of the class, not the class itself.<\/p>\n\n\n\n<p>So we:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>instantiate <code>MyPlugin<\/code>,<\/li>\n\n\n\n<li>pass it the QGIS interface (<code>iface<\/code>).<\/li>\n<\/ul>\n\n\n\n<p>QGIS will then:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>call <code>initGui()<\/code> when activating the plugin,<\/li>\n\n\n\n<li>call <code>unload()<\/code> when deactivating.<\/li>\n<\/ul>\n\n\n\n<p>&#x27a1;&#xfe0f; This is the <strong>concrete creation of the plugin<\/strong> in QGIS.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Summary\"><\/span>Summary<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>__init__.py<\/code> tells QGIS which class to use for the plugin.<\/li>\n\n\n\n<li>The <code>classFactory()<\/code> function is <strong>mandatory<\/strong>.<\/li>\n\n\n\n<li><code>iface<\/code> provides full access to the QGIS interface.<\/li>\n\n\n\n<li>The plugin starts functioning only after instantiating:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>MyPlugin(iface)\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"The_metadatatxt_File\"><\/span>The <code>metadata.txt<\/code> File<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>This file is <strong>fundamental<\/strong>: without it, QGIS will not recognize the plugin.<\/p>\n\n\n\n<p>It contains general information:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>plugin name,<\/li>\n\n\n\n<li>description,<\/li>\n\n\n\n<li>author,<\/li>\n\n\n\n<li>version,<\/li>\n\n\n\n<li>minimum QGIS version.<\/li>\n<\/ul>\n\n\n\n<p>Example:<\/p>\n\n\n<div class='stb-container stb-style-black'><div class='stb-caption'><div class='stb-logo'><img class='stb-logo__image' src='data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN\/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz\/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH\/w\/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA\/g88wAAKCRFRHgg\/P9eM4Ors7ONo62Dl8t6r8G\/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt\/qIl7gRoXgugdfeLZrIPQLUAoOnaV\/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl\/AV\/1s+X48\/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H\/LcL\/\/wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93\/+8\/\/UegJQCAZkmScQAAXkQkLlTKsz\/HCAAARKCBKrBBG\/TBGCzABhzBBdzBC\/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD\/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q\/pH5Z\/YkGWcNMw09DpFGgsV\/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY\/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4\/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L\/1U\/W36p\/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N\/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26\/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE\/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV\/MN8C3yLfLT8Nvnl+F30N\/I\/9k\/3r\/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt\/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi\/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a\/zYnKOZarnivN7cyzytuQN5zvn\/\/tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO\/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3\/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA\/0HIw6217nU1R3SPVRSj9Yr60cOxx++\/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3\/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX\/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8\/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb\/1tWeOT3dvfN6b\/fF9\/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR\/cGhYPP\/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF\/6i\/suuFxYvfvjV69fO0ZjRoZfyl5O\/bXyl\/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o\/2j5sfVT0Kf7kxmTk\/8EA5jz\/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5\/wAAgOkAAHUwAADqYAAAOpgAABdvkl\/FRgAAD59JREFUeNrsmnmMXVd9xz9nucvbZvF4GdtjO46dhcRZSGmCSIAExaUFQtoiUVSgFFQBFaISRaBSoH9QVaUUAU2VSrSVoGELSgRpGshCA8GQYGfBcVZsx47j2dc3M2\/ee3c55\/z6xxubpOSPCSX8QXOkq3ve1ZXO+dzfcr7nd54SEX4TmuY3pL0E8hLIi9Ts8z08Ojr3nN9iAgklzdl54iRBCBROcXx8kTgynBxvcuN3D\/Lk0TFtrNmiQrHnA++48qz3vu2KM0VYd\/jYhPrAJ77cHptenqrV0hNac9gH\/Wi73W5bLbz7rZdx9Wv2MDk+RV4UVBoNQhkofUHaV0fCcxPSu669dm0gL8ikWmGtGWy3O+dqFa48d9vQqx99\/MQF01NLGwb6BxJr4fYfPs7iYhcdPCHrLjsJY319tf22kd7T7XR+EkROAO5XbpG1tCBCCNKfZcXe8cmFd1SMvOmc7ZvM7p0jHBltc9UVF9PJFV\/6+r185ZYHGN52Jko8zeZS39z84nl7zt1x3puvPv89N912YEwr\/Q3vw80hhPt\/rSAhBKpJcvnWTYMfuuk7D72FIFz3qXdzbLTJR\/\/pLuKBjdz+4CS3PTDOTXc+QiWJ2LqxD18UlBFs3taHTgZptiPqfUMj3Ux9RIL+k1q9fn2z2fxXYPrFBxHB2uj9Q+v6\/nrThnjbKy85h0svOoPtm4dYLhUbRraw2HV85+FJlFZsP+cMNNDOcogNpi\/ionPWc8bGKnf++Dg7tqznlZeMMDDQtymtJJ8S1Ou8hL8KhAMvGohI0Cay\/1BvND6YJpWkXqtxzesu4Mb\/Psz9Nx1i64YGjeF1dLolmyINSqGCICFgfRUpPT4rObrgIPZ86M9ex3lnrCNNYWx6AQ3U+\/quHB2b+lpfLf3L0he3\/upBRFSSVv+5Uq38eb1SUY16leVOyT9+8yHufGQSSSyPtT1FJaVSq6KNQikFBIIP4DziPFFW0ml1mex45tqeTUMNjo3P8eRTTepVTSWJue\/A47sG+tMvXnjBrkQrfVPQYXUS6v8ColBKqXaWfyatpO+vVaqqUU1ZWMr47Lce4ZsPjlMdqFFppGSRIUpiImvQSvXGDYHECN55sszh05xKYnnv3nO45pLtPDOzxF987kfY4HnDq7bS6XaoN\/pR2g0rrT7\/zDMnl7NW985IB2A1DV9zzdpAQvDPwcha7fdFJnywWkl1f73Ccjfw8Rse5LYnptk0Moitppg0xiYRylq0VSilQQkEQYtQ1SK6k6si15SR5Ws\/HaUQGK4Y9l6+i6KbMT7f4a59T7E8d5wdm2NqtXRrrW4\/7Z0fVbgnRIUXZhHXnkQpCEFotctLa7X6RwcHBpO+WoX5VsGnbz7E3cfn2bx9iKiWYqopNo3RscVEEUor0KrnCOIpCw8aUqMRoxBtGG91mG3nvPW3d\/F7l2ymcCUHD0+ysNjmwANzHD4+yuzcAm97y+UXp\/XKJ4vW8p9ao3PU87uXej4Zf\/2X\/xMfAo1aXL3wZVu+UvroD\/c\/OsMr9uzglgcmuOngBBu3rcM2qkTV9LRFTGyJkghR+ufjBY+4gCtLQlmiypKaBM4aiPnkVbuppxGtlQ7dLMP7AudKHnjsaZqLy0xOT9NaaeGkIJLyXaEovhIQ+eyn\/nZtFvnYF+6m0y15+XnDr7\/u42988w23Psm\/33aYN77+YprKsmFzP1E1wVZibDUmqsSYNMEkEcYa0KBYDXYREecxRqtgFDnIpprh46\/doeqJoSwd1hisMRQltHPHzpF1bFhXYXhTnbt\/dJCJySZbhvs+stBc\/J4ry8k1i8ZaAoMN07hw99B7Dj05a2\/dd4zLf+tMrnrFDtZvqJNbgyQRNo2wadyLjzTCxhZtNFpptFYorUgiEyppJDqJeq4XW3X59n7VV4lwLpxORkortNYoFHnh6WYlWV5y7lkjWGOYXWjtiZJ0b5Skas0g3SzDqnD+xsHK74gyXHnpLqr9NbpeuOjMIX53zzCNaoSJLcZaTGTQ0erkFav3Xox4Ee0VykYaYy1RZHnZUK2X0f+XvysUIoJWGqM1BEjThN1nbqHV6pI5eZcytrpmkLN3btJFKVdNzXbivVfs5FWXbOPEbIcb95\/kwdFFFgpPmkRoazBWY6zBaIM+DcFqvzc7AaV1710HHJzrnF4V1LNgRAmIoFTvudYaVwaGhvqIraGbla\/RqB1rBumrJVsaib3yth88zZdufozLzh\/mrB2DLBWek8sZj8ys0CwDohRaK7QCo1atoBT6WXetFEYrdG+hR2mIrH7u4hYEEQheCNLrA6c\/iHeBXbtHWGq27A\/2PX75mtNvu1NcGLzsUTriq7cfYaG0GKu5+oJh\/uCKM5npeh5e6HKsK3R9oL66UD37657qqtVr9Q1io7nr5DIXDibh5Rsb2jlHQABBIygBQRCRU8sfPgTi2DI42GCpefjlawYps3y3c7I+rcY4rzg23uKP33Qer71ohJ3Dg73PGjzfG13mxqdXmCgDKgrE2vyCiNCnbO4EJQGNsJCV\/NfTTT1Sj9lQjdCiyfPAUidHGcEahQ+ChJ6FAPK8ZHjLRrZsXb99zSBTUwu7RKWxUoZaJeaho002PzzNta88g6IoUNqitWLvjn4u3lDjtrE2t8\/kOK9IIv2s4F31\/RAQ7xDvIQRSA\/vGFhmbX+GanQPUDDxxdJYfHjjBxTtqXLSzThIHfPCE4PG+FzvOOdrtzvo1g+RlWG8ji9IGUFRjQyO1dPKCOOoFLWhCEDZUI959dj\/dsMQtE13iJKJiNbHpZa3gheAd4jwSAoSeZkq14sh8m78fXUA6npUTc7Snltj\/03HeuXcrey9dj\/ehdwVPEMG7QNbN62sXjX5Fi7WI9OODkEQRl501QGyEbl4SiyKJY4zWeBdQGi5dFyMIjy2VLDrPYiYkBhIFwQckeCQ4vHeIc0jpSEQwSpN1utjS01+JaHtP4XvS3zmP8wHnHKherAQRvWaQUE5nSpZwJicrhxiuj7BlncV5hy\/l55kpijBGEzycP5Bw0VDKTNezWHoems+5Z7pDy3m0BMR7gu+5SnC9S7xAIYTlHApP8AGDZ\/+hCc7bZkjiQFmWlM5hjGFqYoaVpaV87SAhn1AevFtBqZj52SmeODbFzpF+NEJe9NKnCMRRhDWKVPf01daaZSuWc\/tTtieKv9s\/BsGjvcc7TyhKQubwWYlkjmxukWx2npAVhDLD5V2enmlx4GHHay\/bTlGWpy1SZCW+LBfXDCKBY6KlLd7V4jSQ5wXfvOMJ9py1iR3DgxRFcWrHSJBAbC3amOesH8ZoWq2M5swSqRKU94TCIXlJyD1SONxKl2xmFp93CWWJ+Jzgc5R3tDs5RVGSFwVBAqDIiwJt7PQLsEj5Mx30uEh5dnAFlUrg6IkZjpyYY9vGBi4EUD054UXwIWC1xhiDUQprNHcdnubz9xxDZyUKIZSBUPYAxHlCt6RoNnF5hlVQrVraKzlOhCjSbByq0O50KZ0DFGXpmJqaR+DwmkGMsY8GCQeCL84WlyG+ACLuO3iSi8\/ZSH+9QhaEEHoZxTuPtbonU7QmNoZ7j0wxNr7IhmqM855QBsR5KAOhdD2I9gpKAt47Mi8ECXgX2DbcYOf2AZbaHXwIaK1YWlrBRhak+Mnas1ZwLRG5W7x7p\/cZynVIk4Tv7z+OF817rr2ATevr5CEQQoTXntJprLGksSEoj1vJ0Z0cJwFxq\/v2AFJ6yuVFytZyb30JHgm+l81Cz1V3bu1DESjyAq2htZLxzMlpnA8zutL3yJq1lpICI+V9oWjPBl8QXAcJXbTk3PHjo9xx33FEHN08J8tzsrwgywoIJZ0s4+v7jrPv0AQV73HtHN8tkMwTugVFc4FyebGXxcSDBE6JK1GgDDRXurS7GS54tNaMjs8xt7DM0nLrWyLMrtkiShlQ8gzivhpc8aFQZnizglWW1Gh++vg4b7hiB2kS4XwgspZqGrHv0Czff3iGnxxZIAhUYk0vnAx4T7GySJmt9MYIAUVACIgKBNWzjIhneaVLN8vxzrO80ub4yRlOjk64bH7sG6EsyzWDaG0BCh\/CjS5vv01ruzmYDkFbEMXs3ALziysMDVTRyuFtRBwJ37nvGX5wcIb+WkwUWUoXUNogoUPZXiSU2bMEbwB6VhHxq0AeE2nQUDqH4JlvtphdyOm285vLlYUD4oq1Fx867cXVNOwfUjb9N2OTv1FaoTCIh9YSjE7O0VfbjHMFA32KsekuE9OLVG1Ai8M7UFrjshY+W0a862lyAcEhEnpVllV5rNCgVneYRoN4jo8ucf+jC3TbxYRV4QtOmxyl1w4S\/CnrKe87zeuVhFcrM3yViEYHYcWXHH5qgl3bhxARxmcLbrrrGCdGF4jihOAEKPHFCr7soJRCUIgLQOjt6bXuSWP9XKGPBLSJuPfRJU6Md2h1Db7sfM5Lfn+0buR0PK0ta52i7m3VZspO8xMmqvyHTWW3IIgrmZiepZN1cWXg8afmeezIBL4EqwNlURKKDiIepQ1B9SaI0ihrfg5gev1ToAjg4ampgMs1hDq+eeSGfPnp6021f3XHpdYOctoPFUhwEMJ9WWvqw6nwRVthOOA59MgRXnHRDvobdb59x0Hml0rq9Qr5coEEhzYWpTTBF70al7Eos1p91Aqs6YEoiyjTS6C+Fx\/agLWK7twTd2ULRz+m4yh71uzWDlK2pn6hbCriblW9Ea8zSWNkbnqW7975AG\/5\/SvYOGiYHB8j8xHKxChtkeAQQFmDMRGo0JvsqiVEW5SOQEUoFSGsQolBjCZfPnJX0TrxXqWjCQi\/ZBH7eQJKKYvP298ubXM5iPucjuoXPv7okwytS+iraiLpIC5FCChvwGiiJAGjCMGhTG\/VRxvQFqViRKUok4CJCSZC4hrBefLxR25wnZMfVTpe8znJCzsfURqUvtt1l\/5Il9knlK28\/d59D9I\/2I9WAe8ygit6ApIERW9j5kShYbUebIEYpSpgKoS0BtUGqjGAa05N5RMHPlPOP\/0v2jTyF\/WgR6EQpX7m85X3aV\/ekRXZh\/MsvzipVNHWYuIY5xxaCWXZqx+b2BKCweURVmKgjsR9qL4BosF1BAvFxGPfkPbKdeXcU\/uVTn9dZ4gKlGoH774quHs2rq9fneWdtxeFeU21Fsfbt2yg3S2YWchRcYwyhjS2NBqWjq+QNCxxwyN6diZ65vu3LPbt\/np7Zemg8WpZ2WQtIfErPtXtlezHrOHL2vCt9uzkSL0irxqsb7pkpdU5o56Y9VhbGxoweudIcJFeWGqtzEy6vH20ODl\/f27qDymTzKqklWFiCL\/8wa566U81L4G8BPL\/A+R\/BgAzCInEE2+\/LgAAAABJRU5ErkJggg==' alt='img'\/><\/div><div class='stb-caption-content'><\/div><div class='stb-tool'><\/div><\/div><div class='stb-content'><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#091;general]\nname=My First Plugin\ndescription=A simple plugin to learn\nversion=0.1\nauthor=Your Name\nqgisMinimumVersion=3.16\n<\/code><\/pre>\n\n\n<p><\/div><\/div>\n\n\n\n<p>This file is what appears in the <strong>QGIS Plugin Manager<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"The_Main_Python_File_eg_my_pluginpy\"><\/span>The Main Python File (e.g., <code>my_plugin.py<\/code>)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>This is where the <strong>core of the plugin<\/strong> resides.<\/p>\n\n\n\n<p>It typically contains:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>the main plugin class,<\/li>\n\n\n\n<li>the <code>initGui()<\/code> and <code>unload()<\/code> methods,<\/li>\n\n\n\n<li>the code that adds a button or menu in QGIS.<\/li>\n<\/ul>\n\n\n\n<p>Simplified example:<\/p>\n\n\n<div class='stb-container stb-style-black'><div class='stb-caption'><div class='stb-logo'><img class='stb-logo__image' src='data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN\/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz\/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH\/w\/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA\/g88wAAKCRFRHgg\/P9eM4Ors7ONo62Dl8t6r8G\/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt\/qIl7gRoXgugdfeLZrIPQLUAoOnaV\/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl\/AV\/1s+X48\/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H\/LcL\/\/wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93\/+8\/\/UegJQCAZkmScQAAXkQkLlTKsz\/HCAAARKCBKrBBG\/TBGCzABhzBBdzBC\/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD\/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q\/pH5Z\/YkGWcNMw09DpFGgsV\/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY\/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4\/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L\/1U\/W36p\/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N\/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26\/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE\/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV\/MN8C3yLfLT8Nvnl+F30N\/I\/9k\/3r\/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt\/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi\/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a\/zYnKOZarnivN7cyzytuQN5zvn\/\/tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO\/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3\/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA\/0HIw6217nU1R3SPVRSj9Yr60cOxx++\/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3\/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX\/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8\/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb\/1tWeOT3dvfN6b\/fF9\/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR\/cGhYPP\/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF\/6i\/suuFxYvfvjV69fO0ZjRoZfyl5O\/bXyl\/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o\/2j5sfVT0Kf7kxmTk\/8EA5jz\/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5\/wAAgOkAAHUwAADqYAAAOpgAABdvkl\/FRgAAD59JREFUeNrsmnmMXVd9xz9nucvbZvF4GdtjO46dhcRZSGmCSIAExaUFQtoiUVSgFFQBFaISRaBSoH9QVaUUAU2VSrSVoGELSgRpGshCA8GQYGfBcVZsx47j2dc3M2\/ee3c55\/z6xxubpOSPCSX8QXOkq3ve1ZXO+dzfcr7nd54SEX4TmuY3pL0E8hLIi9Ts8z08Ojr3nN9iAgklzdl54iRBCBROcXx8kTgynBxvcuN3D\/Lk0TFtrNmiQrHnA++48qz3vu2KM0VYd\/jYhPrAJ77cHptenqrV0hNac9gH\/Wi73W5bLbz7rZdx9Wv2MDk+RV4UVBoNQhkofUHaV0fCcxPSu669dm0gL8ikWmGtGWy3O+dqFa48d9vQqx99\/MQF01NLGwb6BxJr4fYfPs7iYhcdPCHrLjsJY319tf22kd7T7XR+EkROAO5XbpG1tCBCCNKfZcXe8cmFd1SMvOmc7ZvM7p0jHBltc9UVF9PJFV\/6+r185ZYHGN52Jko8zeZS39z84nl7zt1x3puvPv89N912YEwr\/Q3vw80hhPt\/rSAhBKpJcvnWTYMfuuk7D72FIFz3qXdzbLTJR\/\/pLuKBjdz+4CS3PTDOTXc+QiWJ2LqxD18UlBFs3taHTgZptiPqfUMj3Ux9RIL+k1q9fn2z2fxXYPrFBxHB2uj9Q+v6\/nrThnjbKy85h0svOoPtm4dYLhUbRraw2HV85+FJlFZsP+cMNNDOcogNpi\/ionPWc8bGKnf++Dg7tqznlZeMMDDQtymtJJ8S1Ou8hL8KhAMvGohI0Cay\/1BvND6YJpWkXqtxzesu4Mb\/Psz9Nx1i64YGjeF1dLolmyINSqGCICFgfRUpPT4rObrgIPZ86M9ex3lnrCNNYWx6AQ3U+\/quHB2b+lpfLf3L0he3\/upBRFSSVv+5Uq38eb1SUY16leVOyT9+8yHufGQSSSyPtT1FJaVSq6KNQikFBIIP4DziPFFW0ml1mex45tqeTUMNjo3P8eRTTepVTSWJue\/A47sG+tMvXnjBrkQrfVPQYXUS6v8ColBKqXaWfyatpO+vVaqqUU1ZWMr47Lce4ZsPjlMdqFFppGSRIUpiImvQSvXGDYHECN55sszh05xKYnnv3nO45pLtPDOzxF987kfY4HnDq7bS6XaoN\/pR2g0rrT7\/zDMnl7NW985IB2A1DV9zzdpAQvDPwcha7fdFJnywWkl1f73Ccjfw8Rse5LYnptk0Moitppg0xiYRylq0VSilQQkEQYtQ1SK6k6si15SR5Ws\/HaUQGK4Y9l6+i6KbMT7f4a59T7E8d5wdm2NqtXRrrW4\/7Z0fVbgnRIUXZhHXnkQpCEFotctLa7X6RwcHBpO+WoX5VsGnbz7E3cfn2bx9iKiWYqopNo3RscVEEUor0KrnCOIpCw8aUqMRoxBtGG91mG3nvPW3d\/F7l2ymcCUHD0+ysNjmwANzHD4+yuzcAm97y+UXp\/XKJ4vW8p9ao3PU87uXej4Zf\/2X\/xMfAo1aXL3wZVu+UvroD\/c\/OsMr9uzglgcmuOngBBu3rcM2qkTV9LRFTGyJkghR+ufjBY+4gCtLQlmiypKaBM4aiPnkVbuppxGtlQ7dLMP7AudKHnjsaZqLy0xOT9NaaeGkIJLyXaEovhIQ+eyn\/nZtFvnYF+6m0y15+XnDr7\/u42988w23Psm\/33aYN77+YprKsmFzP1E1wVZibDUmqsSYNMEkEcYa0KBYDXYREecxRqtgFDnIpprh46\/doeqJoSwd1hisMRQltHPHzpF1bFhXYXhTnbt\/dJCJySZbhvs+stBc\/J4ry8k1i8ZaAoMN07hw99B7Dj05a2\/dd4zLf+tMrnrFDtZvqJNbgyQRNo2wadyLjzTCxhZtNFpptFYorUgiEyppJDqJeq4XW3X59n7VV4lwLpxORkortNYoFHnh6WYlWV5y7lkjWGOYXWjtiZJ0b5Skas0g3SzDqnD+xsHK74gyXHnpLqr9NbpeuOjMIX53zzCNaoSJLcZaTGTQ0erkFav3Xox4Ee0VykYaYy1RZHnZUK2X0f+XvysUIoJWGqM1BEjThN1nbqHV6pI5eZcytrpmkLN3btJFKVdNzXbivVfs5FWXbOPEbIcb95\/kwdFFFgpPmkRoazBWY6zBaIM+DcFqvzc7AaV1710HHJzrnF4V1LNgRAmIoFTvudYaVwaGhvqIraGbla\/RqB1rBumrJVsaib3yth88zZdufozLzh\/mrB2DLBWek8sZj8ys0CwDohRaK7QCo1atoBT6WXetFEYrdG+hR2mIrH7u4hYEEQheCNLrA6c\/iHeBXbtHWGq27A\/2PX75mtNvu1NcGLzsUTriq7cfYaG0GKu5+oJh\/uCKM5npeh5e6HKsK3R9oL66UD37657qqtVr9Q1io7nr5DIXDibh5Rsb2jlHQABBIygBQRCRU8sfPgTi2DI42GCpefjlawYps3y3c7I+rcY4rzg23uKP33Qer71ohJ3Dg73PGjzfG13mxqdXmCgDKgrE2vyCiNCnbO4EJQGNsJCV\/NfTTT1Sj9lQjdCiyfPAUidHGcEahQ+ChJ6FAPK8ZHjLRrZsXb99zSBTUwu7RKWxUoZaJeaho002PzzNta88g6IoUNqitWLvjn4u3lDjtrE2t8\/kOK9IIv2s4F31\/RAQ7xDvIQRSA\/vGFhmbX+GanQPUDDxxdJYfHjjBxTtqXLSzThIHfPCE4PG+FzvOOdrtzvo1g+RlWG8ji9IGUFRjQyO1dPKCOOoFLWhCEDZUI959dj\/dsMQtE13iJKJiNbHpZa3gheAd4jwSAoSeZkq14sh8m78fXUA6npUTc7Snltj\/03HeuXcrey9dj\/ehdwVPEMG7QNbN62sXjX5Fi7WI9OODkEQRl501QGyEbl4SiyKJY4zWeBdQGi5dFyMIjy2VLDrPYiYkBhIFwQckeCQ4vHeIc0jpSEQwSpN1utjS01+JaHtP4XvS3zmP8wHnHKherAQRvWaQUE5nSpZwJicrhxiuj7BlncV5hy\/l55kpijBGEzycP5Bw0VDKTNezWHoems+5Z7pDy3m0BMR7gu+5SnC9S7xAIYTlHApP8AGDZ\/+hCc7bZkjiQFmWlM5hjGFqYoaVpaV87SAhn1AevFtBqZj52SmeODbFzpF+NEJe9NKnCMRRhDWKVPf01daaZSuWc\/tTtieKv9s\/BsGjvcc7TyhKQubwWYlkjmxukWx2npAVhDLD5V2enmlx4GHHay\/bTlGWpy1SZCW+LBfXDCKBY6KlLd7V4jSQ5wXfvOMJ9py1iR3DgxRFcWrHSJBAbC3amOesH8ZoWq2M5swSqRKU94TCIXlJyD1SONxKl2xmFp93CWWJ+Jzgc5R3tDs5RVGSFwVBAqDIiwJt7PQLsEj5Mx30uEh5dnAFlUrg6IkZjpyYY9vGBi4EUD054UXwIWC1xhiDUQprNHcdnubz9xxDZyUKIZSBUPYAxHlCt6RoNnF5hlVQrVraKzlOhCjSbByq0O50KZ0DFGXpmJqaR+DwmkGMsY8GCQeCL84WlyG+ACLuO3iSi8\/ZSH+9QhaEEHoZxTuPtbonU7QmNoZ7j0wxNr7IhmqM855QBsR5KAOhdD2I9gpKAt47Mi8ECXgX2DbcYOf2AZbaHXwIaK1YWlrBRhak+Mnas1ZwLRG5W7x7p\/cZynVIk4Tv7z+OF817rr2ATevr5CEQQoTXntJprLGksSEoj1vJ0Z0cJwFxq\/v2AFJ6yuVFytZyb30JHgm+l81Cz1V3bu1DESjyAq2htZLxzMlpnA8zutL3yJq1lpICI+V9oWjPBl8QXAcJXbTk3PHjo9xx33FEHN08J8tzsrwgywoIJZ0s4+v7jrPv0AQV73HtHN8tkMwTugVFc4FyebGXxcSDBE6JK1GgDDRXurS7GS54tNaMjs8xt7DM0nLrWyLMrtkiShlQ8gzivhpc8aFQZnizglWW1Gh++vg4b7hiB2kS4XwgspZqGrHv0Czff3iGnxxZIAhUYk0vnAx4T7GySJmt9MYIAUVACIgKBNWzjIhneaVLN8vxzrO80ub4yRlOjk64bH7sG6EsyzWDaG0BCh\/CjS5vv01ruzmYDkFbEMXs3ALziysMDVTRyuFtRBwJ37nvGX5wcIb+WkwUWUoXUNogoUPZXiSU2bMEbwB6VhHxq0AeE2nQUDqH4JlvtphdyOm285vLlYUD4oq1Fx867cXVNOwfUjb9N2OTv1FaoTCIh9YSjE7O0VfbjHMFA32KsekuE9OLVG1Ai8M7UFrjshY+W0a862lyAcEhEnpVllV5rNCgVneYRoN4jo8ucf+jC3TbxYRV4QtOmxyl1w4S\/CnrKe87zeuVhFcrM3yViEYHYcWXHH5qgl3bhxARxmcLbrrrGCdGF4jihOAEKPHFCr7soJRCUIgLQOjt6bXuSWP9XKGPBLSJuPfRJU6Md2h1Db7sfM5Lfn+0buR0PK0ta52i7m3VZspO8xMmqvyHTWW3IIgrmZiepZN1cWXg8afmeezIBL4EqwNlURKKDiIepQ1B9SaI0ihrfg5gev1ToAjg4ampgMs1hDq+eeSGfPnp6021f3XHpdYOctoPFUhwEMJ9WWvqw6nwRVthOOA59MgRXnHRDvobdb59x0Hml0rq9Qr5coEEhzYWpTTBF70al7Eos1p91Aqs6YEoiyjTS6C+Fx\/agLWK7twTd2ULRz+m4yh71uzWDlK2pn6hbCriblW9Ea8zSWNkbnqW7975AG\/5\/SvYOGiYHB8j8xHKxChtkeAQQFmDMRGo0JvsqiVEW5SOQEUoFSGsQolBjCZfPnJX0TrxXqWjCQi\/ZBH7eQJKKYvP298ubXM5iPucjuoXPv7okwytS+iraiLpIC5FCChvwGiiJAGjCMGhTG\/VRxvQFqViRKUok4CJCSZC4hrBefLxR25wnZMfVTpe8znJCzsfURqUvtt1l\/5Il9knlK28\/d59D9I\/2I9WAe8ygit6ApIERW9j5kShYbUebIEYpSpgKoS0BtUGqjGAa05N5RMHPlPOP\/0v2jTyF\/WgR6EQpX7m85X3aV\/ekRXZh\/MsvzipVNHWYuIY5xxaCWXZqx+b2BKCweURVmKgjsR9qL4BosF1BAvFxGPfkPbKdeXcU\/uVTn9dZ4gKlGoH774quHs2rq9fneWdtxeFeU21Fsfbt2yg3S2YWchRcYwyhjS2NBqWjq+QNCxxwyN6diZ65vu3LPbt\/np7Zemg8WpZ2WQtIfErPtXtlezHrOHL2vCt9uzkSL0irxqsb7pkpdU5o56Y9VhbGxoweudIcJFeWGqtzEy6vH20ODl\/f27qDymTzKqklWFiCL\/8wa566U81L4G8BPL\/A+R\/BgAzCInEE2+\/LgAAAABJRU5ErkJggg==' alt='img'\/><\/div><div class='stb-caption-content'><\/div><div class='stb-tool'><\/div><\/div><div class='stb-content'><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class MyPlugin:\n    def __init__(self, iface):\n        self.iface = iface\n\n    def initGui(self):\n        pass\n\n    def unload(self):\n        pass\n<\/code><\/pre>\n\n\n<p><\/div><\/div>\n\n\n\n<p>Don\u2019t worry if this seems confusing\u2014each element will be explained in detail in future articles.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Optional_but_Common_Files\"><\/span>Optional but Common Files<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Graphical_Interfaces_ui\"><\/span>Graphical Interfaces (<code>.ui<\/code>)<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>QGIS uses Qt for GUIs. <code>.ui<\/code> files are created with <strong>Qt Designer<\/strong>, without coding.<\/p>\n\n\n\n<p>They allow you to build windows with:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>buttons,<\/li>\n\n\n\n<li>dropdown lists,<\/li>\n\n\n\n<li>input fields.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Resources_resourcesqrc\"><\/span>Resources (<code>resources.qrc<\/code>)<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>This file collects:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>icons,<\/li>\n\n\n\n<li>images,<\/li>\n\n\n\n<li>other graphical resources.<\/li>\n<\/ul>\n\n\n\n<p>It is compiled into Python so it can be used in the plugin.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"What_You_Need_to_Remember_for_Now\"><\/span>What You Need to Remember for Now<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>At this stage, the key points are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>a QGIS plugin is a <strong>file structure<\/strong>, not a big complex program,<\/li>\n\n\n\n<li>each file has a <strong>specific role<\/strong>,<\/li>\n\n\n\n<li>you can create <strong>simple, useful plugins<\/strong> with very little code.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Whats_Next\"><\/span>What\u2019s Next?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>In the next article, we will see:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>how to <strong>create an empty plugin<\/strong> using Plugin Builder,<\/li>\n\n\n\n<li>where to place the files,<\/li>\n\n\n\n<li>how to <strong>load and test the plugin in QGIS<\/strong>.<\/li>\n<\/ul>\n\n\n\n<p>The goal will be to have a <strong>first functional plugin<\/strong>, even if it doesn\u2019t do much yet.<\/p>\n\n\n\n<p>&#x1f449; The most important thing is <strong>not to go fast, but to understand each step<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Developing a QGIS plugin may seem reserved for experienced programmers, but with the right approach, anyone can create their own. This tutorial explains why plugins are essential, what they can do, and how a plugin is&hellip;<\/p>\n","protected":false},"author":1,"featured_media":16329,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"give_campaign_id":0,"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"sfsi_plus_gutenberg_text_before_share":"","sfsi_plus_gutenberg_show_text_before_share":"","sfsi_plus_gutenberg_icon_type":"","sfsi_plus_gutenberg_icon_alignemt":"","sfsi_plus_gutenburg_max_per_row":"","_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[3394,1377],"tags":[4117,4119,4121,4123,4115],"class_list":["post-16337","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-pluigin-en","category-qgis-en","tag-create-qgis-plugin","tag-pyqgis-beginner","tag-qgis-automation-plugin","tag-qgis-plugin-structure","tag-qgis-plugin-tutorial"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2026\/01\/pluginsQGIS1.jpg?fit=409%2C307&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/p6XU0A-4fv","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/posts\/16337","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/comments?post=16337"}],"version-history":[{"count":0,"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/posts\/16337\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/media\/16329"}],"wp:attachment":[{"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/media?parent=16337"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/categories?post=16337"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/tags?post=16337"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}