Documentation
Ici vous pouvez trouver ce qui est nouveau et ce qui est cassé sous l'API PyQGIS .
Pour obtenir des détails sur la façon de porter Python2 vers Python3, allez-y
Vous pouvez trouver quelques détails sur les tests de QGIS2 à QGIS3 sur cette question: Vous écrivez des tests automatisés pour les plugins QGIS?
Et vous trouverez ici un article intéressant d' OpenGis.ch sur les outils de migration.
Qu'est-ce qui va changer dans mon code
En fait, vous devez changer le code du plugin qui n'est pas prêt à passer par une nouvelle version.
Vous obtenez la fonction qgis.utils.QGis.QGIS_VERSION_INT qui est faite pour vérifier la version de QGIS. C'est utile lorsqu'une fonction est dépréciée. Par exemple setSelectedFeatures
depuis 2.16.
Par exemple avec l'utilisation de la if
déclaration:
if qgis.utils.QGis.QGIS_VERSION_INT < 21600 :
joinLayer.setSelectedFeatures( [ f.id() for f in request ] )
else:
joinLayer.selectByIds( [ f.id() for f in request ] )
Il en va de même pour l' PyQt
objet que vous importez sous votre module. Si vous avez besoin de compatibilité, le prix est d'écrire plus de ligne de code (le code avec la fonction QGIS2 et le code avec les fonctions QGIS3 ET aussi le code pour vérifier la version et les capacités d'importer de nouvelles bibliothèques).
À propos des bibliothèques PyQt
Le PyQt5 n'est pas rétrocompatible avec PyQt4; il y a plusieurs changements importants dans PyQt5. Cependant, il n'est pas très difficile d'ajuster l'ancien code à la nouvelle bibliothèque. Les différences sont, entre autres, les suivantes:
Les modules Python ont été réorganisés. Certains modules ont été supprimés (QtScript), d'autres ont été divisés en sous-modules (QtGui, QtWebKit).
De nouveaux modules ont été introduits, notamment QtBluetooth, QtPositioning ou Enginio.
- PyQt5 ne prend en charge que le signal de style nouveau et le handlig de slots. Les appels vers SIGNAL () ou SLOT () ne sont plus pris en charge. PyQt5 ne prend en charge aucune partie de l'API Qt marquée comme obsolète ou obsolète dans Qt v5.0.
source: ( http://zetcode.com/gui/pyqt5/introduction/ )
Voici quelques exemples de modifications apportées à votre instruction from / import:
Rappelez-vous qu'avec PyQt4 vous avez dû regarder le doc de l'API:
par exemple
module PyQT4 QtCore module
PyQT4 QtGui
from PyQt4.QtCore import QSettings, QTranslator, qVersion, QCoreApplication, Qt, QObject, SIGNAL
from PyQt4.QtGui import QAction, QIcon, QDialog, QFormLayout
Et avec PyQt5, vous devez maintenant regarder le document de ces API:
module PyQt5 QtCore module
PyQt5 QtGui
pour devenir:
from PyQt5.QtCore import QSettings, QTranslator, QVersionNumber, QCoreApplication, Qt, QObject, pyqtSignal
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAction, QDialog, QFormLayout
Notez que :
Le module QtGui a été divisé en sous-modules. Le module QtGui contient des classes pour l'intégration du système de fenêtrage, la gestion des événements, les graphiques 2D, l'imagerie de base, les polices et le texte. Il contient également un ensemble complet de liaisons OpenGL et OpenGL ES (voir Prise en charge d'OpenGL ). Les développeurs d'applications l'utilisent normalement avec des API de niveau supérieur telles que celles contenues dans le module QtWidgets.
Et PyQt5 ne prend en charge que le signal de style nouveau et le handlig! jetez un œil à cette page pour comprendre comment utiliser pyqtSignal
, connect
et e
objet d'événement au lieu de l'utiliser SIGNAL
.
Rendez-le compatible
Donc, avec la compatibilité entre PyQt4 / PyQt5 (et QGIS2 / QGIS3 également), vous devez essayer / sauf l'importation avant d'utiliser la bibliothèque pyQt5.
try:
from PyQt5.QtCore import QSettings, QTranslator, QVersionNumber, QCoreApplication, Qt, QObject, pyqtSignal
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAction, QDialog, QFormLayout
except:
from PyQt4.QtCore import QSettings, QTranslator, qVersion, QCoreApplication, Qt, QObject, SIGNAL
from PyQt4.QtGui import QAction, QIcon, QDialog, QFormLayout
Et n'oubliez pas que vous devez également modifier certaines fonctions spécifiques sous votre code en ajoutant l'instruction try / except ou if.
from PyQt4.QtCore import *
avecfrom PyQt4.QtCore import QSomething, QWhatever, QElse
, cela va rendre le script de migration font la dernière étape correctement (y compris les ajustements nécessaires lorsque les modules modifiés), donc pas essayer, sauf les importations sont nécessaires.