Nutzerinnen und Nutzer von QGIS sind schon sehr gespannt auf die Neuerungen, die QGIS 4.0 mit sich bringen wird. Sie auch? Wir haben uns bereits im Vorfeld der Veröffentlichung im Oktober 2025 umgeschaut und uns damit beschäftigt, was die neue Version für QGIS-Plugins bedeutet.
Sind diese mit der neuen Version kompatibel oder muss manches angepasst oder neu geschrieben werden?
Damit Sie sich schon jetzt auf den Umstieg auf QGIS 4.0 vorbereiten können, geben wir Ihnen in diesem Beitrag einen Überblick über die Veränderungen in QGIS 4.0 und weisen darauf hin, an welcher Stelle wir konkreten Handlungsbedarf sehen.
Die Veröffentlichung von QGIS 4.0 ist für Oktober 2025 angesetzt und wird keine LTR-Version sein. Das aktuelle QGIS 3.40 LTR wird bis Mai 2026 mit Updates versorgt und erst dann durch QGIS 4.2 LTR abgelöst werden. Wenn Sie sich in Ihrer Organisation immer an der aktuellen LTR-Version orientieren wollen, haben Sie also noch ein gutes Jahr Zeit, sich um den Umstieg zu kümmern.
Kern und Hintergrund des Upgrades auf QGIS 4.0 ist das nahende Supportende von Qt5.
Qt ist ein plattformübergreifendes C++-Framework, mit dem unter anderem die grafische Benutzeroberfläche von QGIS gebaut ist. Auf Qt basieren damit alle grafischen Elemente - wie Schaltflächen, Fenster und Symbole. Darüber hinaus ermöglicht Qt aber auch die saubere Integration in Betriebssysteme und bietet grundlegende Datenstrukturen und Funktionen für die Programmierung. Als zentrale Komponente von QGIS ist ein Upgrade von Qt5 auf Qt6 daher unausweichlich. Der Umstieg auf Qt6 bietet allerdings auch eine ganze Reihe neuer Möglichkeiten für die Entwicklung neuer Funktionen in QGIS, von denen wir in zukünftigen QGIS-Versionen profitieren werden.
Die größten Veränderungen in QGIS 4.0 sind nicht sichtbar, sodass der Wechsel auf QGIS 4.0 den meisten Nutzer*innen – abgesehen von der neuen Versionsnummer im Namen – nicht auffallen dürfte.
Ein paar Neuerungen möchten wir aber dennoch ansprechen:
Plugins, die für QGIS 3 geschrieben worden sind, verwenden standardmäßig Qt5. Um den Übergang zu erleichtern, bleiben einige “veraltete” APIs in Qt6 zwar vorerst erhalten, werden jedoch in zukünftigen Versionen entfernt. Eine Anpassung der Plugins wird daher in den allermeisten Fällen notwendig sein.
Nicht immer. Plugins, die in Qt6 geschrieben wurden, sind nicht automatisch mit Qt5 kompatibel. Je nach Komplexität und Umfang des Plugins kann es aber sein, dass nur gemeinsam genutzte Klassen verwendet werden und es nicht zu Problemen kommt. Für Entwickler*innen ist es jedoch kein großer Aufwand, den Plugin-Code für beiden Qt-Versionen kompatibel zu halten.
Das hängt davon ab, in welcher Umgebung Plugins genutzt werden.
Öffentliche Plugins werden im Idealfall sowohl für Qt5 als auch Qt6 kompatibel gemacht. Somit kann sichergestellt werden, dass alle Anwender*innen während und auch nach der Übergangszeit sowohl QGIS 3 als auch QGIS 4 nutzen können.
Bei internen Plugins und einem konkreten Termin für das Upgrade auf QGIS 4 innerhalb Ihrer Organisation reicht im Prinzip auch die Kompatibilität zu Qt6. Für eine gleichzeitige Kompatibilität zu Qt5 und Qt6 steht ein Skript der QGIS-Entwicklercommunity zur Verfügung, mit dem die Migration größtenteils automatisiert vollzogen werden kann und Ihnen viel händische Arbeit erspart. Eine kurze Anleitung zur Verwendung des Migrationsskripts finden Sie im nächsten Abschnitt.
Für Windows gibt es bereits QGIS-Versionen, die mit Qt6 kompiliert worden sind. Damit kann direkt getestet werden, ob ein vorhandenes Plugin kompatibel ist.
Wir haben über den OSGeo4W-Installer die aktuelle QGIS 3.40 LTR mit Qt6 installiert.
Als zu testendes Plugin verwenden wir ein Mini-Plugin, das ein paar repräsentative Qt5-spezifische Ausdrücke beinhaltet. Bei der Installation in QGIS mit Qt6 teilt uns QGIS direkt mit, dass es Probleme gibt:
AttributeError: type object 'Qt' has not attribute 'Unchecked'
Es besteht Handlungsbedarf.
Für die Portierung steht uns das Skript pyqt5_to_pyqt6.py zur Verfügung, das den Großteil oder sogar alle erforderlichen Änderungen automatisch umsetzt. Wir haben uns für den auf Github beschriebenen Weg mit Docker entschieden, der sehr unkompliziert funktioniert. Vorteil dieser Variante ist, dass wir uns nicht mit installierten Python-Versionen und fehlenden Bibliotheken beschäftigen müssen.
Wechseln Sie in das Verzeichnis, in dem der Quellcode für das Plugin liegt:
cd /pfad/zum/plugin
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 abgelegt wird.
Wenn wir anschließend ins Plugin schauen, sehen wir 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:
Damit wird das zugrunde liegende Prinzip sichtbar: Neben der Anpassung von enums hat sich bspw. auch der Aufruf von exec_() zu exec() verändert. Eine weiterführende Auflistung von Änderungen finden Sie hier: Differences Between PyQt6 and PyQt5
Wichtig: QGIS unter Qt6 prüft bei der Installation von Erweiterungen, ob diese bereits mit Qt6 kompatibel sind. Um QGIS mitzuteilen, dass wir uns bereits darum gekümmert haben, sollten Sie in die metadata.txt folgenden Wert einfügen:
supportsQt6=True
Nach der erneuten Installation des Plugins in QGIS erscheint nun keine Fehlermeldung mehr und das Plugin startet wie gewünscht.
1. Die nächste QGIS LTR-Version ist QGIS 4.2 und erscheint im Mai 2026. Damit haben Sie noch ein gutes Jahr Zeit für den Umstieg, wenn Sie sich immer an der LTR-Version orientieren.
2. Plugins müssen überarbeitet werden, um mit QGIS4 / Qt6 kompatibel zu sein. Der Aufwand dafür ist überschaubar und kann zu großen Teilen toolgestützt durchgeführt werden.