Документация
Здесь вы можете найти, что нового и что ломается под PyQGIS API .
Чтобы получить подробную информацию о том, как перенести Python2 на Python3, перейдите туда
Вы можете найти некоторые подробности о тестировании от QGIS2 до QGIS3 по этому вопросу: Написание автоматических тестов для плагинов QGIS?
И здесь вы найдете интересную статью OpenGis.ch об инструментах миграции.
Что изменится в моем коде
Фактически, вам нужно изменить код плагина, который не готов пройти через новую версию.
Вы получаете функцию qgis.utils.QGis.QGIS_VERSION_INT, которая предназначена для проверки версии QGIS. Это полезно, когда функция устарела. Для примера setSelectedFeatures
с 2.16.
В качестве примера с использованием if
выписки:
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 ] )
То же самое относится и к PyQt
объекту, который вы импортируете в свой модуль. Если вам нужна совместимость, стоит написать больше строки кода (код с функцией QGIS2 и код с функциями QGIS3, а также код для проверки версии и возможности импорта новых библиотек).
О библиотеках PyQt
PyQt5 не имеет обратной совместимости с PyQt4; Есть несколько существенных изменений в PyQt5. Тем не менее, не очень сложно настроить старый код для новой библиотеки. Отличия, среди прочего, следующие:
Модули Python были реорганизованы. Некоторые модули были отброшены (QtScript), другие были разбиты на подмодули (QtGui, QtWebKit).
Были представлены новые модули, включая QtBluetooth, QtPosition или Enginio.
- PyQt5 поддерживает только новый стиль сигналов и слотов. Вызовы SIGNAL () или SLOT () больше не поддерживаются. PyQt5 не поддерживает какие-либо части Qt API, которые помечены как устаревшие или устаревшие в Qt v5.0.
источник: ( http://zetcode.com/gui/pyqt5/introduction/ )
Вот несколько примеров изменений в вашем утверждении from / import:
Помните , с PyQt4 вы должны были смотреть на документ в API,:
для Exemple
PyQt4 QtCore модуль
PyQt4 QtGui модуль
from PyQt4.QtCore import QSettings, QTranslator, qVersion, QCoreApplication, Qt, QObject, SIGNAL
from PyQt4.QtGui import QAction, QIcon, QDialog, QFormLayout
А теперь с PyQt5 вы должны взглянуть на документацию по API:
PyQt5 QtCore module
PyQt5 QtGui module
так что становитесь
from PyQt5.QtCore import QSettings, QTranslator, QVersionNumber, QCoreApplication, Qt, QObject, pyqtSignal
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAction, QDialog, QFormLayout
Обратите внимание, что :
Модуль QtGui был разбит на подмодули. Модуль QtGui содержит классы для интеграции оконной системы, обработки событий, 2D-графики, базовых изображений, шрифтов и текста. Он также содержит полный набор привязок OpenGL и OpenGL ES (см. Поддержка OpenGL ). Разработчики приложений обычно используют это с API более высокого уровня, такими как те, которые содержатся в модуле QtWidgets.
А PyQt5 поддерживает только новый стиль сигналов и слотов! Посмотрите на эту страницу, чтобы понять, как использовать pyqtSignal
, connect
и e
объект события вместо использования SIGNAL
.
Сделайте это совместимым
Так что с совместимостью между PyQt4 / PyQt5 (и QGIS2 / QGIS3 также) вы должны попробовать / исключить импорт, прежде чем использовать библиотеку 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
И не забывайте, что вам нужно также изменить какую-то конкретную функцию в своем коде, добавив оператор try / исключением или if.
from PyQt4.QtCore import *
сfrom PyQt4.QtCore import QSomething, QWhatever, QElse
, это не сделает сценарий миграции сделать последний шаг надлежащим образом ( в том числе необходимых корректировок , где измененные модули), поэтому нет примерочного , кроме импорта необходимы.