Dokumentacja
Tutaj możesz znaleźć, co nowego, a co psuje się w interfejsie API PyQGIS .
Aby uzyskać szczegółowe informacje na temat sposobu przenoszenia Python2 na Python3, przejdź tam
Szczegółowe informacje na temat testowania z QGIS2 na QGIS3 można znaleźć w tym pytaniu: Pisanie automatycznych testów wtyczek QGIS?
Znajdziesz tu interesujący artykuł OpenGis.ch na temat narzędzi do migracji.
Co zmieni się w mój kod
W rzeczywistości musisz zmienić kod wtyczki, która nie jest przygotowana do przejścia przez nową wersję.
Otrzymasz qgis.utils.QGis.QGIS_VERSION_INT funkcję, która jest wykonana w celu sprawdzenia wersji QGIS. Jest to przydatne, gdy funkcja jest przestarzała. Na przykład setSelectedFeatures
od 2.16.
Na przykład za pomocą if
instrukcji:
if qgis.utils.QGis.QGIS_VERSION_INT < 21600 :
joinLayer.setSelectedFeatures( [ f.id() for f in request ] )
else:
joinLayer.selectByIds( [ f.id() for f in request ] )
To samo dotyczy PyQt
obiektu importowanego w ramach modułu. Jeśli potrzebujesz kompatybilności, cena polega na napisaniu większej liczby linii kodu (kod z funkcją QGIS2 i kod z funkcjami QGIS3 ORAZ także kod do sprawdzenia wersji i możliwości importowania nowych bibliotek).
O bibliotekach PyQt
PyQt5 nie jest wstecznie kompatybilny z PyQt4; istnieje kilka istotnych zmian w PyQt5. Jednak dostosowanie starszego kodu do nowej biblioteki nie jest trudne. Różnice są między innymi następujące:
Moduły Python zostały zreorganizowane. Niektóre moduły zostały usunięte (QtScript), inne zostały podzielone na submoduły (QtGui, QtWebKit).
Wprowadzono nowe moduły, w tym QtBluetooth, QtPositioning lub Enginio.
- PyQt5 obsługuje tylko obsługę sygnałów i gniazd w nowym stylu. Wywołania SIGNAL () lub SLOT () nie są już obsługiwane. PyQt5 nie obsługuje żadnych części interfejsu API Qt, które są oznaczone jako przestarzałe lub nieaktualne w Qt v5.0.
źródło: ( http://zetcode.com/gui/pyqt5/introduction/ )
Oto kilka przykładów zmian w wyciągu z / import:
Pamiętaj, że z PyQt4 musiałeś przejrzeć dokumentację API:
na przykład
moduł
PyQT4 QtCore moduł PyQT4 QtGui
from PyQt4.QtCore import QSettings, QTranslator, qVersion, QCoreApplication, Qt, QObject, SIGNAL
from PyQt4.QtGui import QAction, QIcon, QDialog, QFormLayout
A z PyQt5 musisz teraz zapoznać się z dokumentacją API:
PyQt5 Moduł QtCore Moduł
PyQt5 QtGui
aby stały się:
from PyQt5.QtCore import QSettings, QTranslator, QVersionNumber, QCoreApplication, Qt, QObject, pyqtSignal
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAction, QDialog, QFormLayout
Uwaga:
Moduł QtGui został podzielony na submoduły. Moduł QtGui zawiera klasy integracji systemu okienkowego, obsługi zdarzeń, grafiki 2D, podstawowego obrazowania, czcionek i tekstu. Zawiera także pełny zestaw powiązań OpenGL i OpenGL ES (zobacz Obsługa OpenGL ). Twórcy aplikacji zwykle używają tego z interfejsami API wyższego poziomu, takimi jak te zawarte w module QtWidgets.
PyQt5 obsługuje tylko obsługę sygnałów i gniazd w nowym stylu! zajrzyj na tę stronę, aby dowiedzieć się, jak używać pyqtSignal
, connect
i e
obiektu zdarzenia zamiast używać SIGNAL
.
Zrób to kompatybilne
Tak więc z kompatybilnością między PyQt4 / PyQt5 (a także QGIS2 / QGIS3) musisz spróbować / oprócz importu przed użyciem biblioteki pyQt5.
try:
from PyQt5.QtCore import QSettings, QTranslator, QVersionNumber, QCoreApplication, Qt, QObject, pyqtSignal
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAction, QDialog, QFormLayout
except:
from PyQt4.QtCore import QSettings, QTranslator, qVersion, QCoreApplication, Qt, QObject, SIGNAL
from PyQt4.QtGui import QAction, QIcon, QDialog, QFormLayout
I nie zapominaj, że musisz zmienić także określoną funkcję w swoim kodzie, dodając instrukcję try / else lub if.
from PyQt4.QtCore import *
zfrom PyQt4.QtCore import QSomething, QWhatever, QElse
będzie to zrobić skrypt migracji zrobić ostatni krok poprawnie (w tym wymaganych korekt gdzie moduły zmienione), więc nie spróbować z wyjątkiem importu są potrzebne.