Newer
Older
# QGIS-Plugin Portierung von Qt5 nach Qt6
Anhand dieses Plugins soll beispielhaft gezeigt werden, wie die Portierung eines QGIS-Plugins von Qt5 nach Qt6 möglich ist, um eine Kompatibilität mit QGIS 4 zu erreichen. Hintergrund dieses Repos ist der [Beitrag](https://wheregroup.com/blog) vom [datum] im WhereGroup-Blog.
Ursprünglicher Code mit Qt5: https://repo.wheregroup.com/ptomschi/qgis4-plugin/-/tree/main?ref_type=heads \
Portierter Code, der Qt5 und Qt6 unterstützt: https://repo.wheregroup.com/ptomschi/qgis4-plugin/-/tree/qt6?ref_type=heads
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
## Vorgehen
Für die Portierung steht uns das Skript [pyqt5_to_pyqt6.py](https://github.com/qgis/QGIS/blob/master/scripts/pyqt5_to_pyqt6/pyqt5_to_pyqt6.py) der QGIS-Entwicklercommunity zur Verfügung, das für uns den Großteil oder sogar alle erforderlichen Änderungen automatisch umsetzt.
Wir haben uns für den auf [Github](https://github.com/qgis/QGIS/wiki/Plugin-migration-to-be-compatible-with-Qt5-and-Qt6) beschriebenen Weg mit Docker entschieden, welcher sehr unkompliziert funktioniert hat. Vorteil dieser Variante ist, dass wir uns nicht mit installierten Python-Versionen und fehlenden Bibliotheken herumschlagen müssen.
1. Wechseln Sie in das Verzeichnis, in dem der Quellcode für das Plugin liegt:
````
cd /pfad/zum/plugin
````
2. Starten des Containers:
````
docker run -v "$(pwd):/home/pyqgisdev/" registry.gitlab.com/oslandia/qgis/pyqgis-4-checker/pyqgis-qt-checker:latest pyqt5_to_pyqt6.py --logfile /home/pyqgisdev/pyqt6_checker.log ./
````
Der Docker Container führt das Skript aus und ersetzt alle “alten" Qt5-spezifischen Inhalte im Pluginverzeichnis.
Änderungen, die das Skript nicht automatisch umgesetzt hat, aber noch zu Problemen in Qt6 führen können, werden im Logfile `pyqt6_checker.log` ausgegeben, welches ebenfalls im Pluginverzeichnis landet. \
Wenn wir anschließend kurz ins Plugin schauen, sehen wir auch direkt einige Änderungen:
````
- self.checkbox.setCheckState(Qt.Unchecked)
+ self.checkbox.setCheckState(Qt.CheckState.Unchecked)
- checkbox.setCheckState(Qt.Checked)
+ checkbox.setCheckState(Qt.CheckState.Checked)
- button_layout = QBoxLayout(QBoxLayout.LeftToRight)
+ button_layout = QBoxLayout(QBoxLayout.Direction.LeftToRight)
- result = dialog.exec_()
+ result = dialog.exec()
- if result == QDialog.Accepted:
+ if result == QDialog.DialogCode.Accepted:
- QMessageBox.Yes | QMessageBox.No,QMessageBox.No,
+ QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No, QMessageBox.StandardButton.No,
- if contact_result == QMessageBox.Yes:
+ if contact_result == QMessageBox.StandardButton.Yes: