QGISプラグインをQt6にも対応をする
QGISでは現行のQt5から現在Qt6への移行を進めています。
QGISの公式サイトでは現在Windows版のビルドがダウンロード可能になっています。
また、macOS版も本家に対してPull Request 🍎 Mac Qt6 .dmgが出されています。
Linux版はまだのようですが、Standalone版であればvcpkgでなんとか作れるかもしれないという感じです。
メーリングリストでは3.46ぐらいからQt6をデフォルトにしたいという話も出ていました。
今回はMIERUNEさんが開発しているプラグイン、GTFS-GO及びqmapcompareに出したパッチを元に、Qt5とQt6の両対応の仕方について解説します。ちなみに、qmapcompareに出したパッチはmergeされました。
metadata.txtの修正
metadata.txt
はQGISのプラグインのトップに配置されるファイルで、文字通りプラグインのメタデータを格納します。
Qt6に対応するにはまずこのファイルにフラグを立てて上げる必要があります。
[general]
name=QMapCompare
qgisMinimumVersion=3.34
supportsQt6=True
...
ここで追加したのはsupportsQt6
というフラグです。
これを有効にすることでQt6版QGISへプラグインがインストール可能となります。
Pythonコードの改修
Pythonコードの改修には二つパターンがあります。一つ目はqgis.PyQt
パッケージへの移行、もう一つはEnumへの対応です。
qgis.PyQt
パッケージへの移行
これはQt6への移行とは直接は関係ない話ではあるのですが、既存のプラグインでは良くPyQt5
のパッケージが直接参照されているケースがあります。
例えばGTFS-GOにあった以下のコードなどです。
from PyQt5.QtWidgets import QAbstractItemView, QDialog, QLineEdit, QMessageBox
これは以下のように書き換えます。
from qgis.PyQt.QtWidgets import QAbstractItemView, QDialog, QLineEdit, QMessageBox
qgis.PyQt
はQt5かQt6かを意識しないで書ける仕組みになっています。
もちろん、Qt5にしか存在しない機能を使う場合は上記の仕組みは上手くいきませんが、大抵は上手くいきます。
Enumへの対応
Qt6対応で一番困るのがEnumの扱いが変わった事です。
例えば、以下のようなコードがあるとします。
self.japanDpfResultTableView.setSelectionBehavior(QAbstractItemView.SelectRows)
この、QAbstractItemView.SelectRows
はQt6には存在しません。
代わりに、QAbstractItemView.SelectionBehavior.SelectRows
を使う必要があります。
これがEnumの扱いが大きく変わった所となります。
では、実際のところどう対応するかというと、Qt6かどうかをチェックする仕組みを用意すればOKです。
from qgis.PyQt.QtCore import QT_VERSION_STR, QDate, QSortFilterProxyModel, Qt
from qgis.PyQt.QtWidgets import QAbstractItemView, QDialog, QLineEdit, QMessageBox
QT_VERSION_INT = int(QT_VERSION_STR.split(".")[0])
if QT_VERSION_INT <= 5:
select_rows = QAbstractItemView.SelectRows
case_insensitive = Qt.CaseInsensitive
ascending_order = Qt.AscendingOrder
else:
select_rows = QAbstractItemView.SelectionBehavior.SelectRows
case_insensitive = Qt.CaseSensitivity.CaseInsensitive
ascending_order = Qt.SortOrder.AscendingOrder
...
self.japanDpfResultTableView.setSelectionBehavior(select_rows)
このような改修をひたすらやっていきます。
ちなみに、このテクニックはBasemapsのソースコードからパクってきました。
先人がいるのは非常に助かりますね!
Discussion