Skip to content

migration

SimonSAMPERE edited this page Sep 2, 2019 · 9 revisions

Journal de bord de la migration du plugin de QGIS 2 à QGIS 3

Objectifs

Evaluer le travail à faire pour adapter le plugin pour la version 3 de QGIS à venir cette année. Détailler les étapes suivies pour la migration d'un point de vue d'un développeur classique de plugin pour QGIS.

Ressources


Pas à pas

Environnement de travail

  • Windows 10 64 bits

  • QGIS est installé avec l'installeur OSGeo4W de façon à disposer du de l'OSGeo shell

  • les commandes globales sont lancées dans Powershell dans lequel Git (télécharger ici pour Windows) est accessible :

Consulter Développement>Environnement pour plus de détails.

Installer les prérequis

  1. Installer la version 3 de QGIS (en dév). Dans le shell OSGeo4W :

    setup
  2. Sélectionner "Advanced Install" >

  3. Sélectionner la version de dév de QGIS :

  4. Sélectionner le package Python future :

L5. Lancer l'installation

Installer pip

Dans le shell OSGeo4W :

python3 -m pip install -U pip setuptools wheel future qgis2to3
python3 -m pip install pb_tool

Objectifs prioritaire : Rendre le plugin compatible avec la version 3 de QGIS

Faire la transition :

  • de Python2 vers Python3
  • de PyQt4 vers PyQt5
  • de PyQGIS2 vers PyQGIS3

Travail préliminaire

Il s'agit des tâches à accomplir avant de pouvoir activer le plugin dans QGIS3.

1- Rendre le plugin reconnaissable par QGIS3

Pour que QGIS3 reconnaisse le plugin comme potentiellement compatible, le fichier metadata.txt doit être modifié. Il doit y être indiqué que le plugin est compatible avec la version de QGIS dans laquelle on cherche à l'activer : "qgisMinimumVersion=3.0" et "qgisMaximumVersion=3.99".

2- Les imports

Les 3 transitions présentées plus haut impliquent en premier lieu d'adapter les dépendances aux évolutions des librairies utilisées par le plugin. Certaines classes ont été renommées, supprimées ou déplacées d'un module à un autre. Si les dépendances ne sont pas corrigées et qu'on cherche à importer un module qui n'existe plus, l'activation du plugin dans QGIS3 est impossible.

Exemples :

  • Python2 vers Python3 :

    from urllib import getproxies, unquote, urlencode
    from urlparse import urlparse

    devient

    from urllib.request import getproxies, unquote
    from urllib.parse import urlencode, urlparse
  • PyQt4 vers PyQt5 :

    from qgis.PyQt.QtGui import QComboBox

    devient

    from qgis.PyQt.QtWidgets import QComboBox
  • PyQGIS2 vers PyQGIS3 :

    from qgis.core import QgsDataSourceURI

    devient

    from qgis.core import QgsDataSourceUri

3- L'interface utilisateur

Il est nécessaire de recompiler les fichier .ui de l'interface pour obtenir des fichiers .py compatibles avec QGIS3. Pour ce faire, les commandes de compilation (voir make.bat) doivent être adaptées. Il s'agit de faire appel aux outils de compilation de Qt5 (accessibles après avoir établi l'environnement de développement) afin d'obtenir des fichiers .py faisant appel à PyQt5.

Compatibilité

Une fois que les étapes précédentes ont été accomplies, l'interface utilisateur du plugin s'affiche dans QGIS3 mais le plugin ne fonctionne pas. La sollicitation des widgets entraîne des erreurs, souvent dues à une mauvaise utilisation des librairies (de PyQt5 et PyQGIS3 notamment).

Pour rendre le plugin compatible, il reste à modifier le code en adaptant l'utilisation des librairies à leurs évolutions. Pour ce faire :

Rendre le plugin plus facile à maintenir

Modulariser le plugin étape par étape

Tester et documenter le plugin pour le rendre plus facile à maintenir

TO DOC

Clone this wiki locally