⤴️

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のソースコードからパクってきました。
先人がいるのは非常に助かりますね!

Georepublic Tech Blog

Discussion