QGIS3プラグイン開発のお仕事がきそうなので、検証も兼ねてQGIS3対応プラグインを本リポジトリに登録公開してみたメモ。
QGIS2 → QGIS3になったことによりシステムが結構変更されています。
- Python3に変更
- PyQt5に変更
- Qt5に変更
- QGISAPIが一部変更
上記変更に該当するコードがある場合は、プラグインを改修する必要があります。
詳しくはこちら
結構変わっていますね。。。
今回修正したプラグインを例に紹介しようと思います。
JapanElevation.py
# PyQt4 → PyQt5に変更。QActionはQtWidgetsに変更。
# from PyQt4.QtCore import *
# from PyQt4.QtGui import *
from PyQt5.QtCore import QSettings, QTranslator, qVersion, QCoreApplication
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAction
# urllib2はpython3で変更。分割してインポート。
# import urllib2
import urllib.request, urllib.error, urllib.parse
# QgsCoordinateTransformは引数増えている。
# Tf = QgsCoordinateTransform(destcrs,QgsCoordinateReferenceSystem(4326))
Tf = QgsCoordinateTransform(destcrs, QgsCoordinateReferenceSystem(4326), QgsProject.instance())
# urllib2はpython3で変更。
# data_all = urllib2.urlopen(URL)
data_all = urllib.request.urlopen(URL)
JapanElevation_dialog.py
# PyQt4 → PyQt5に変更。
# from PyQt4 import QtCore, QtGui, uic
from PyQt5 import uic, QtWidgets, QtCore
# QtGui.QDialogはQtWidgets.QDialogに変更。
# class JapanElevationDialog(QtGui.QDialog, FORM_CLASS):
class JapanElevationDialog(QtWidgets.QDialog, FORM_CLASS):
metadata.txt
# バージョンは3.0に設定。
# qgisMinimumVersion=2.14
qgisMinimumVersion=3.0
↓ JapanElevationと同一部分は説明省略 ↓
AttributeAssignment.py
# QgsMapLayerRegistryはQgsProjectに変更。
# layers = QgsMapLayerRegistry.instance().mapLayers()
layers = QgsProject.instance().mapLayers()
AttributeAssignment_base.py
# 今回は.uiが無くなっていたので修正しましたが、
# 修正するより.ui → .pyにもう一度変換をおすすめ。
# QtGui.QApplicationはQtWidgets.QApplicationに変更。
# _encoding = QtGui.QApplication.UnicodeUTF8
_encoding = QtWidgets.QApplication.UnicodeUTF8
# QtGui.QApplicationはQtWidgets.QApplicationに変更。
# return QtGui.QApplication.translate(context, text, disambig, _encoding)
return QtWidgets.QApplication.translate(context, text, disambig, _encoding)
# QtGui.QApplicationはQtWidgets.QApplicationに変更。
# return QtGui.QApplication.translate(context, text, disambig)
return QtWidgets.QApplication.translate(context, text, disambig)
# QtGui.QLabelはQtWidgets.QLabelに変更。
# self.label_layer = QtGui.QLabel(AttributeAssignment)
self.label_layer = QtWidgets.QLabel(AttributeAssignment)
# connectの指定方法が変更。記述短くなった。
# QtCore.QObject.connect(self.mMapLayerComboBox, QtCore.SIGNAL(_fromUtf8("layerChanged(QgsMapLayer*)")), self.mFieldComboBox.setLayer)
self.mMapLayerComboBox.layerChanged['QgsMapLayer*'].connect(self.mFieldComboBox.setLayer)
この他に「resources.qrc」と「xxx.ui」も新たに作成または修正する必要があります。
pyrccとpyuicはQGIS3では5に変更されています。
QGIS2の時はOSGeo4W Shellで、さくっと変換できたのですがパスが通っていないのか動きません。 batを作成すると動きました。
パスはQGIS3のインストールディレクトリを指定します。
batを変換したいファイルと同一ディレクトリに置いてコマンドプロンプトで実行します。
resources.pyとxxx.pyが作成されます。
resources.bat
@echo off
call "C:\ProgramFolder\QGIS300\bin\o4w_env.bat"
call "C:\ProgramFolder\QGIS300\bin\qt5_env.bat"
call "C:\ProgramFolder\QGIS300\bin\py3_env.bat"
@echo on
pyrcc5 -o resources.py resources.qrc
ui.bat
@echo off
call "C:\ProgramFolder\QGIS300\bin\o4w_env.bat"
call "C:\ProgramFolder\QGIS300\bin\qt5_env.bat"
call "C:\ProgramFolder\QGIS300\bin\py3_env.bat"
@echo on
pyuic5 -o xxx.py xxx.ui
無事、本リポジトリへの更新申請も通ったようです。 本リポジトリには、まだ100くらいのプラグインしか公開されていないようなので移行がうまく進めばいいのですが。これから移行するかた、新たに作成されるかたの参考になれば幸いです。
QGISについて、他にも記事を書いています。よろしければぜひ。
tags - QGIS
- 参考文献 QGIS stackexchange