Dokumentation
Hier finden Sie unter der PyQGIS-API , was neu ist und was nicht .
Hier erfahren Sie , wie Sie Python2 auf Python3 portieren
Zu dieser Frage finden Sie einige Details zum Testen von QGIS2 auf QGIS3: Automatisierte Tests für QGIS-Plugins schreiben?
Und hier finden Sie einen interessanten Beitrag von OpenGis.ch zu den Migrations-Tools.
Was wird sich in meinem Code ändern
Tatsächlich müssen Sie den Code des Plugins ändern, das nicht für die Weitergabe einer neuen Version vorbereitet ist.
Sie erhalten die Funktion qgis.utils.QGis.QGIS_VERSION_INT , mit der die QGIS-Version überprüft wird. Dies ist nützlich, wenn eine Funktion nicht mehr unterstützt wird. Zum Beispiel setSelectedFeatures
seit 2.16.
Beispiel mit der Verwendung von if
Anweisung:
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 ] )
Das Gleiche gilt für PyQt
Objekte, die Sie unter Ihrem Modul importieren. Wenn Sie Kompatibilität benötigen, ist der Preis mehr Codezeile zu schreiben (der Code mit QGIS2-Funktion und der Code mit QGIS3-Funktionen UND auch der Code zum Überprüfen der Version und der Möglichkeiten zum Importieren neuer Bibliotheken).
Über PyQt-Bibliotheken
Der PyQt5 ist nicht abwärtskompatibel mit PyQt4; Es gibt einige signifikante Änderungen in PyQt5. Es ist jedoch nicht sehr schwierig, älteren Code an die neue Bibliothek anzupassen. Die Unterschiede sind unter anderem folgende:
Python-Module wurden neu organisiert. Einige Module wurden entfernt (QtScript), andere wurden in Submodule aufgeteilt (QtGui, QtWebKit).
Es wurden neue Module eingeführt, darunter QtBluetooth, QtPositioning oder Enginio.
- PyQt5 unterstützt nur die Signal- und Slots-Handlig-Funktion des neuen Stils. Die Aufrufe von SIGNAL () oder SLOT () werden nicht mehr unterstützt. PyQt5 unterstützt keine Teile der Qt-API, die in Qt 5.0 als veraltet oder veraltet markiert sind.
Quelle: ( http://zetcode.com/gui/pyqt5/introduction/ )
Hier einige Beispiele für Änderungen an Ihrer from / import-Anweisung:
Denken Sie daran, dass Sie sich mit PyQt4 das API-Dokument ansehen mussten :
Zum Beispiel das
PyQT4-QtCore-Modul Das
PyQT4-QtGui-Modul
from PyQt4.QtCore import QSettings, QTranslator, qVersion, QCoreApplication, Qt, QObject, SIGNAL
from PyQt4.QtGui import QAction, QIcon, QDialog, QFormLayout
Und mit PyQt5 müssen Sie sich jetzt das
PyQt5 QtCore-Modul von
PyQt5 QtGui ansehen
so dass werden:
from PyQt5.QtCore import QSettings, QTranslator, QVersionNumber, QCoreApplication, Qt, QObject, pyqtSignal
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAction, QDialog, QFormLayout
Beachten Sie, dass :
Das QtGui-Modul wurde in Submodule aufgeteilt. Das QtGui-Modul enthält Klassen für die Integration von Fenstersystemen, Ereignisbehandlung, 2D-Grafiken, grundlegende Bildbearbeitung, Schriftarten und Text. Es enthält auch einen vollständigen Satz von OpenGL- und OpenGL ES-Bindungen (siehe Unterstützung für OpenGL ). Anwendungsentwickler verwenden dies normalerweise mit APIs höherer Ebenen, wie sie im QtWidgets-Modul enthalten sind.
Und PyQt5 unterstützt nur das neuartige Signal und die handlig-Slots! haben Sie einen Blick auf dieser Seite zu verstehen , wie zu verwenden pyqtSignal
, connect
und e
Ereignisobjekt statt Verwendung SIGNAL
.
Mache es kompatibel
Um die Kompatibilität zwischen PyQt4 / PyQt5 (und QGIS2 / QGIS3) zu gewährleisten, müssen Sie den Import versuchen / ausnehmen, bevor Sie die pyQt5-Bibliothek verwenden.
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
Und vergessen Sie nicht, dass Sie auch eine bestimmte Funktion in Ihrem Code ändern müssen, indem Sie die Anweisung try / except oder if hinzufügen.
from PyQt4.QtCore import *
mitfrom PyQt4.QtCore import QSomething, QWhatever, QElse
, wird dies die Migration Skript macht richtig den letzten Schritt tun (einschließlich dem erforderlichen Anpassungen bei denen Module geändert), so dass keine try-except Importen benötigt werden.