เอกสาร
นี่คุณจะพบสิ่งใหม่และสิ่งที่อยู่ภายใต้การแบ่ง PyQGIS API
เพื่อรับรายละเอียดเกี่ยวกับวิธีพอร์ต Python2 ไปยัง Python3 ไปที่นั่น
คุณสามารถหารายละเอียดเกี่ยวกับการทดสอบจาก QGIS2 ถึง QGIS3 ในคำถามนี้: การเขียนการทดสอบอัตโนมัติสำหรับปลั๊กอิน QGIS?
และคุณจะพบกระดาษของ OpenGis.ch ที่น่าสนใจที่นี่เกี่ยวกับเครื่องมือการย้ายข้อมูล
อะไรจะเปลี่ยนเป็นรหัสของฉัน
ในความเป็นจริงคุณต้องเปลี่ยนรหัสของปลั๊กอินที่ไม่ได้เตรียมที่จะผ่านรุ่นใหม่
คุณได้รับฟังก์ชันqgis.utils.QGis.QGIS_VERSION_INTซึ่งทำขึ้นเพื่อตรวจสอบเวอร์ชั่น QGIS นี่คือประโยชน์เมื่อฟังก์ชันถูกคิดค่าเสื่อมราคา สำหรับตัวอย่างsetSelectedFeatures
ตั้งแต่ 2.16
โดยสุดยอดกับการใช้if
คำสั่ง:
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 ] )
มันเหมือนกันกับPyQt
วัตถุที่คุณนำเข้าภายใต้โมดูล หากคุณต้องการความเข้ากันได้ราคาคือการเขียนบรรทัดรหัสเพิ่มเติม (รหัสที่มีฟังก์ชั่น QGIS2 และรหัสที่มีฟังก์ชั่น QGIS3 และรหัสสำหรับการตรวจสอบรุ่นและความสามารถในการนำเข้าห้องสมุดใหม่)
เกี่ยวกับห้องสมุด PyQt
PyQt5 นั้นไม่สามารถใช้ร่วมกับ PyQt4 แบบย้อนหลังได้ มีการเปลี่ยนแปลงที่สำคัญหลายอย่างใน PyQt5 อย่างไรก็ตามมันไม่ยากที่จะปรับโค้ดเก่าให้เป็นไลบรารี่ใหม่ ความแตกต่างระหว่างคนอื่น ๆ มีดังนี้
โมดูล Python ถูกปรับโครงสร้างใหม่ บางโมดูลถูกดร็อป (QtScript), โมดูลอื่นถูกแบ่งเป็น submodules (QtGui, QtWebKit)
โมดูลใหม่ได้รับการแนะนำรวมถึง QtBluetooth, QtPositioning หรือ Enginio
- PyQt5 รองรับเฉพาะสัญญาณสไตล์ใหม่และ handlig ของสล็อต ไม่รองรับการโทรไปยัง SIGNAL () หรือ SLOT () PyQt5 ไม่สนับสนุนส่วนใด ๆ ของ Qt API ที่ทำเครื่องหมายว่าเลิกใช้แล้วหรือล้าสมัยใน Qt v5.0
แหล่งที่มา: ( http://zetcode.com/gui/pyqt5/introduction/ )
นี่คือตัวอย่างบางส่วนของการเปลี่ยนแปลงในคำสั่ง from / import ของคุณ:
จดจำด้วย PyQt4 คุณต้องดูเอกสาร API ของ:
สำหรับ
โมดูล PyQT4 QtCoreตัวอย่างโมดูลPyQT4 โมดูล
PyQT4 QtGui
from PyQt4.QtCore import QSettings, QTranslator, qVersion, QCoreApplication, Qt, QObject, SIGNAL
from PyQt4.QtGui import QAction, QIcon, QDialog, QFormLayout
และด้วย PyQt5 ตอนนี้คุณต้องมองหาเอกสารของ API เหล่านั้น:
PyQt5 โมดูลQtCore โมดูล
PyQt5 QtGui
ดังนั้นกลายเป็น:
from PyQt5.QtCore import QSettings, QTranslator, QVersionNumber, QCoreApplication, Qt, QObject, pyqtSignal
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAction, QDialog, QFormLayout
โปรดทราบว่า:
โมดูล QtGui ได้ถูกแบ่งออกเป็น submodules โมดูล QtGui มีคลาสสำหรับการรวมระบบหน้าต่างการจัดการเหตุการณ์กราฟิก 2D การสร้างภาพขั้นพื้นฐานฟอนต์และข้อความ นอกจากนี้ยังมีชุดของการผูก OpenGL และ OpenGL ES ที่สมบูรณ์ (ดูการสนับสนุนสำหรับ OpenGL ) นักพัฒนาแอปพลิเคชันจะใช้สิ่งนี้กับ API ระดับสูงกว่าเช่นที่อยู่ในโมดูล QtWidgets
และ PyQt5 รองรับเฉพาะสัญญาณรูปแบบใหม่และ handlig สล็อต! มีลักษณะที่ดูหน้านี้ที่จะเข้าใจวิธีการใช้งานpyqtSignal
, connect
และวัตถุเหตุการณ์แทนการใช้e
SIGNAL
ทำให้มันเข้ากันได้
ดังนั้นด้วยความเข้ากันได้ระหว่าง PyQt4 / PyQt5 (และ QGIS2 / QGIS3 เช่นกัน) คุณต้องลอง / ยกเว้นการนำเข้าก่อนที่จะใช้ pyQt5 librarie
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
และอย่าลืมว่าคุณต้องเปลี่ยนฟังก์ชั่นบางอย่างภายใต้รหัสของคุณด้วยการเพิ่มลอง / ยกเว้นหรือถ้ามีคำสั่ง
from PyQt4.QtCore import *
ด้วยfrom PyQt4.QtCore import QSomething, QWhatever, QElse
สิ่งนี้จะทำให้สคริปต์การโอนย้ายทำขั้นตอนสุดท้ายได้อย่างถูกต้อง (รวมถึงการปรับเปลี่ยนที่จำเป็นเมื่อโมดูลเปลี่ยนแปลง) ดังนั้นจึงไม่จำเป็นต้องลอง