2.x এবং 3.x উভয় সংস্করণের জন্য কিউজিআইএস পাইথন প্লাগইন তৈরি করবেন?


12

আমি একটি কিউজিআইএস পাইথন প্লাগইন থেকে স্থানান্তরিত এবং বিভিন্ন সংস্থান ব্রাউজ QGIS 2করার প্রক্রিয়ায় আছি QGIS 3

এটি উভয় সংস্করণের সাথেই প্লাগইন সামঞ্জস্য করা সম্ভব কিনা বা প্লাগইন সংস্করণে এটির দুটি হ্যান্ডেল প্রয়োজনীয় কিনা তা পরিষ্কার নয়।

আমি এখন পর্যন্ত যে সমস্যার মুখোমুখি হয়েছি তা হল কীভাবে পাইকিউটি আমদানি (পাইকিউটি 4 / পাইকিউটি 5) পরিচালনা করবেন?

উত্তর:


18

নথিপত্র

এখানে আপনি পাইকিজিআইআইএস এপিআই এর অধীনে নতুন এবং কোনটি বিরতি তা আবিষ্কার করতে পারেন ।
কীভাবে পোর্টের Python2 Python3 করার বিবরণ পেতে যেতে সেখানে

আপনি এই প্রশ্নের কিউআইজিআইএস 2 থেকে কিউজিআইএস 3 পর্যন্ত পরীক্ষার বিষয়ে কিছু বিশদ জানতে পারেন: কিউআইজিআইএস প্লাগইনগুলির জন্য স্বয়ংক্রিয় পরীক্ষাগুলি লিখছেন?

এবং মাইগ্রেশন সরঞ্জামগুলি সম্পর্কে আপনি এখানে একটি আকর্ষণীয় ওপেনগিস.চ. এর কাগজ পাবেন ।

আমার কোডে কি পরিবর্তন হবে

আসলে, আপনাকে এমন একটি প্লাগইনের কোড পরিবর্তন করতে হবে যা কোনও নতুন সংস্করণ পেরিয়ে যাওয়ার জন্য প্রস্তুত নয়।

আপনি 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আপনি আপনার মডিউলটির অধীনে যে জিনিসটি আমদানি করছেন এটি একই । আপনার যদি সামঞ্জস্যতা প্রয়োজন হয় তবে দামটি আরও কোড লাইন (কিউজিআইএস 2 ফাংশন সহ কোড এবং কিউজিআইএস 3 ফাংশন সহ কোড এবং সংস্করণ এবং নতুন লাইব্রেরি আমদানির ক্ষমতা পরীক্ষা করার জন্য কোড) লিখতে হবে।

পাইকিউটি গ্রন্থাগার সম্পর্কে

পাইকিউটি 5 পাইকিউটি 4 এর সাথে পিছনে সামঞ্জস্যপূর্ণ নয়; পাইকিউটি 5 তে বেশ কয়েকটি উল্লেখযোগ্য পরিবর্তন রয়েছে। তবে নতুন লাইব্রেরিতে পুরানো কোডটি সামঞ্জস্য করা খুব কঠিন নয় difficult পার্থক্যগুলি, অন্যদের মধ্যে নিম্নলিখিত হিসাবে রয়েছে:

  • পাইথন মডিউলগুলি পুনর্গঠিত করা হয়েছে। কিছু মডিউল ফেলে দেওয়া হয়েছে (কিউটিস্ক্রিপ্ট), অন্যগুলিকে সাবমোডিয়ালে বিভক্ত করা হয়েছে (কিউটিগুই, কিউটিউবকিট)।

  • কিউটি ব্লুটুথ, কিউটিপজিশনিং বা ইঞ্জিনিও সহ নতুন মডিউল প্রবর্তিত হয়েছে।

  • পাইকিউটি 5 কেবলমাত্র নতুন স্টাইলের সিগন্যাল এবং স্লট হ্যান্ডলিগ সমর্থন করে। সিগন্যাল () বা স্লট () এ কলগুলি আর সমর্থিত নয়। পাইকিউটি 5 কিউটি এপিআই-এর এমন কোনও অংশকে সমর্থন করে না যা Qt v5.0 এ অবচিত বা অপ্রচলিত হিসাবে চিহ্নিত হয়েছে are

উত্স: ( http://zetcode.com/gui/pyqt5/intr پيداوار/ )

আপনার / আমদানি বিবৃতিতে পরিবর্তনের কয়েকটি উদাহরণ এখানে রয়েছে:

পাইকিউটি 4 এর সাথে মনে রাখবেন আপনাকে এপিআই'র ডকটি সন্ধান করতে হবে:
উদাহরণস্বরূপ
পাইকিকিটি 4 কিউটকোর মডিউল
পাইকিউটি 4 কিউটিগুই মডিউল

from PyQt4.QtCore import QSettings, QTranslator, qVersion, QCoreApplication, Qt, QObject, SIGNAL

from PyQt4.QtGui import QAction, QIcon, QDialog, QFormLayout

এবং পাইকিউটি 5 এর সাথে আপনাকে এখন সেই
এপিআই'র ডকটি দেখতে হবে: পাইকিউটি 5 কিউটিকোর মডিউল
পাইকিউটি 5 কিউটিগুই মডিউল

সুতরাং যে হয়ে:

from PyQt5.QtCore import QSettings, QTranslator, QVersionNumber, QCoreApplication, Qt, QObject, pyqtSignal 
from PyQt5.QtGui import QIcon 
from PyQt5.QtWidgets import QAction, QDialog, QFormLayout

মনে রাখবেন যে :

কিউটিগুই মডিউলটি সাবমোডিয়ুলে বিভক্ত হয়েছে। কিউটিগুই মডিউলে উইন্ডোটিং সিস্টেম ইন্টিগ্রেশন, ইভেন্ট হ্যান্ডলিং, 2 ডি গ্রাফিক্স, বেসিক ইমেজিং, ফন্ট এবং পাঠ্যের জন্য ক্লাস রয়েছে। এতে ওপেনজিএল এবং ওপেনজিএল ইএস বাইন্ডিংগুলির একটি সম্পূর্ণ সেট রয়েছে ( ওপেনগিএলের জন্য সমর্থন দেখুন )। অ্যাপ্লিকেশন বিকাশকারীরা সাধারণত উচ্চতর স্তরের এপিআই যেমন QtWidgets মডিউলটিতে থাকা হিসাবে এটি ব্যবহার করবে।

এবং পাইকিউটি 5 কেবলমাত্র নতুন স্টাইলের সিগন্যাল এবং স্লট হ্যান্ডলিগ সমর্থন করে! এই পৃষ্ঠাটিতে একটি চেহারা আছে কিভাবে ব্যবহার করতে বুঝতে pyqtSignal, connectএবং eঘটনা বস্তুর পরিবর্তে ব্যবহার SIGNAL

এটি সামঞ্জস্যপূর্ণ করুন

সুতরাং পাইকিউটি 4 / পাইকিউটি 5 (এবং পাশাপাশি কিউজিআইএস 2 / কিউজিআইএস 3) এর মধ্যে সামঞ্জস্যতার সাথে আপনাকে পাইকিউ 5 লাইব্রেরি ব্যবহারের আগে আমদানি ব্যতীত / চেষ্টা করতে হবে।

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

এবং ভুলে যাবেন না যে আপনার কোডের আওতায় কিছু নির্দিষ্ট ফাংশন পরিবর্তন করার চেষ্টা করে / বাদে বা যদি বিবৃতি যোগ করে আপনাকে পরিবর্তন করতে হবে।


2
দুর্দান্ত উত্তর, যেটিকে খুব বড় আকারে সহায়তা করবে তা হ'ল প্রথমে যে কোনওটিকে প্রতিস্থাপন from PyQt4.QtCore import *করা from PyQt4.QtCore import QSomething, QWhatever, QElse, এটি মাইগ্রেশন স্ক্রিপ্টটি সঠিকভাবে শেষ পদক্ষেপটি করবে (মডিউলগুলি পরিবর্তিত হয়েছে সেখানে প্রয়োজনীয় সমন্বয়গুলি সহ), সুতরাং আমদানি ব্যতীত আর কোনও চেষ্টা করার প্রয়োজন নেই।
ম্যাথিয়াস কুহন

আপনি ঠিক বলেছেন আমি এটি সহজ রাখতে * ব্যবহার করেছি তবে আমি এটি পরিবর্তন করব, আপনার প্রতিক্রিয়াটির জন্য ধন্যবাদ
হুগো রউস্যাফা - জিওড্যাটআপ অক্টোব

এই বিষয়টি লোককে *-আমদানি ব্যবহার না করার জন্য বলার সঠিক জায়গা, কারণ এখানে এটি আসলে একটি পার্থক্য করে
ম্যাথিয়াস কুহন

@ হুগো: খুব বিস্তারিত উত্তর সত্যই, এটি শুরু করতে অনেক সাহায্য করেছিল। আমি ইতিমধ্যে উদ্ধৃত অসংখ্য ব্যবহারকারীর সংস্থানগুলিতে কিগিস 2 ক্যাম্প্যাট প্লাগইন যুক্ত করব ।
সিগেল

এটা দুর্দান্ত ধারণা। উত্তরটি আপনি চান হিসাবে সম্পাদনা করতে পারেন। প্রতিক্রিয়ার জন্য ধন্যবাদ
হুগো রউস্যাফা - জিওড্যাটআপ

2

এরকম কিছু চেষ্টা করুন:

try:
    # action for QGIS 3/PyQt5
except:
    # action for QGIS 2/PyQt4

এটি কিছু বিচ্ছিন্ন জিনিসের জন্য কাজ করতে পারে তবে প্রায়শই সাধারণ সমাধান হিসাবে কাজ করবে না।
ম্যাথিয়াস

1

আমি একটি QGIS পাইথন প্লাগইন পোর্টিং শেষ করেছি যাতে এটি এখন 2.x এবং 3.x উভয়ই QGIS সংস্করণ সমর্থন করে। আমার অভিজ্ঞতা এখানে:

বেশিরভাগ ক্ষেত্রে আমি কিউজিআইএস সংস্করণে নির্ভর করার চেষ্টা করেছি। এমনকি সংস্করণটি ধারণ করে রাখা ক্লাসটিও কিছুটা নতুন নামকরণ করা হয়েছিল। তাই আমি প্রথম করেছি

try:
    from qgis.utils import Qgis  # for QGIS 3
except ImportError:
    from qgis.utils import QGis as Qgis  #  for QGIS 2

এবং তারপরে চেক তৈরি করুন

if Qgis.QGIS_VERSION >= '3.0':
    # something for QGIS 3
else:
    # something for QGIS 2

একটি চূড়ান্ত সংস্করণ স্থাপনের পরে আমি লক্ষ্য করেছি যে একটি ফাইল resources.pyযা স্বয়ংক্রিয়ভাবে তৈরি হয় pyrcc5তাও পোর্ট করা দরকার। অন্যথায় প্লাগইনটি ২.x এ ভাঙ্গতে থাকবে। সুতরাং আমি এর লাইন পরিবর্তন করেছি

from PyQt5 import QtCore

প্রতি

try:
    from PyQt5 import QtCore
except:
    from PyQt4 import QtCore

দেখে মনে হচ্ছে এটি কাজ করেছে। আমি একটি অফিসিয়াল রিলিজ করেছি এবং ভেবেছিলাম এটিই। তবেই আমি এই ক্রমটি আবিষ্কার করেছি:

আমার প্লাগইনটি কিউজিআইএস ২.১! এ ইনস্টল করুন, কিউজিআইএস বন্ধ করুন, কিউজিআইএস আগান খুলুন এবং তারপরে কিউজিআইএস-এর ভিতরে পাইথন কনসোলটি খুলুন -> সম্পূর্ণ QGIS তত্ক্ষণাত ক্রাশ হয়ে যাবে!

কিছু পরীক্ষার পরে আমি খুঁজে পেলাম কারণটি ছিল resources.pyউপরে লিখিত এই ছোট পরিবর্তন । আমি কিউজিআইএস পাইথন লাইব্রেরিতে বিশেষজ্ঞ নই তবে আমার ব্যাখ্যাটি নিম্নলিখিত:

আমি যখন কিউজিআইএস খুলি তখন আমার প্লাগইনটি আরম্ভ হয়। এরকম প্রচেষ্টা করুন from PyQt5 import QtCoreভুল PyQt সংস্করণ সামনে QGIS "কর্মপ্রবাহ" এ কারণগুলো কিছু পরিবর্তন একটি ব্যতিক্রম (এটি একটি ছিল উত্থাপন RuntimeError)। আমি যখন পাইথন কনসোল শুরু করি তখন এই পরিবর্তনগুলির কারণে কিউজিআইএস ক্র্যাশ হয়।

শেষে আমি সিদ্ধান্ত নিয়েছিলাম অন্যরকম সমাধানের জন্য। কারণ কিউজিআইএস 2 পাইথন ২.7 ব্যবহার করে এবং কিউজিআইএস 3 পাইথন 3 ব্যবহার করে আমি সর্বদা পাইথন সংস্করণে চেক তৈরি করি ।

from sys import version_info

if version_info[0] >= 3:
    # something for QGIS 3
else:
    # something for QGIS 2

এটি সম্ভাব্য ক্ষতিকারক আমদানির সমস্ত প্রচেষ্টা এড়িয়ে চলে। আমার প্লাগইন এখন উভয়ই QGIS সংস্করণে কোনও সমস্যা ছাড়াই কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.