Qt 5.11 - How to Create Qt Plugins

Qt Plugins कैसे बनाये




qt

Qt Plugins कैसे बनाये

Qt प्लगइन्स बनाने के लिए दो API प्रदान करता है:

  • Qt ही एक्सटेंशन लिखने के लिए एक उच्च-स्तरीय एपीआई: कस्टम डेटाबेस ड्राइवर, छवि प्रारूप, टेक्स्ट कोडेक्स, कस्टम स्टाइल आदि।
  • Qt अनुप्रयोगों के विस्तार के लिए एक निम्न-स्तरीय API।

उदाहरण के लिए, यदि आप एक कस्टम QStyle उपवर्ग लिखना चाहते हैं और Qt अनुप्रयोगों को गतिशील रूप से लोड करते हैं, तो आप उच्च-स्तरीय API का उपयोग करेंगे।

चूंकि उच्च-स्तरीय API निचले-स्तरीय API के शीर्ष पर बनाया गया है, इसलिए कुछ समस्याएं दोनों के लिए सामान्य हैं।

यदि आप Qt डिज़ाइनर के साथ उपयोग के लिए प्लगइन्स प्रदान करना चाहते हैं, तो Qt डिज़ाइनर मॉड्यूल प्रलेखन देखें।

विषय:

उच्च-स्तरीय एपीआई: लेखन क्यूटी एक्सटेंशन

एक प्लगइन लिखना जो Qt को बढ़ाता है, उपयुक्त प्लगइन बेस क्लास को उप-लिंक करके, कुछ फ़ंक्शन को लागू करने और मैक्रो को जोड़कर प्राप्त किया जाता है।

कई प्लगइन बेस क्लास हैं। व्युत्पन्न प्लगइन्स डिफ़ॉल्ट रूप से मानक प्लगइन निर्देशिका की उप-निर्देशिकाओं में संग्रहीत किए जाते हैं। यदि वे उचित निर्देशिका में संग्रहीत नहीं हैं, तो Qt को प्लगइन्स नहीं मिलेंगे।

निम्न तालिका प्लगइन बेस कक्षाओं को सारांशित करती है। कुछ कक्षाएं निजी हैं, और इसलिए प्रलेखित नहीं हैं। आप उनका उपयोग कर सकते हैं, लेकिन बाद में क्यूटी संस्करणों के साथ कोई संगतता वादा नहीं है।

बेस क्लास निर्देशिका का नाम क्यूटी मॉड्यूल मुख्य मामला संवेदनशीलता
QAccessibleBridgePlugin accessiblebridge क्यूटी जीयूआई अक्षर संवेदनशील
QImageIOPlugin imageformats क्यूटी जीयूआई अक्षर संवेदनशील
QPictureFormatPlugin (अप्रचलित) pictureformats क्यूटी जीयूआई अक्षर संवेदनशील
QAudioSystemPlugin audio Qt मल्टीमीडिया असंवेदनशील मामला
QDeclarativeVideoBackendFactoryInterface video/declarativevideobackend Qt मल्टीमीडिया असंवेदनशील मामला
QGstBufferPoolPlugin video/bufferpool Qt मल्टीमीडिया असंवेदनशील मामला
QMediaPlaylistIOPlugin playlistformats Qt मल्टीमीडिया असंवेदनशील मामला
QMediaResourcePolicyPlugin resourcepolicy Qt मल्टीमीडिया असंवेदनशील मामला
QMediaServiceProviderPlugin mediaservice Qt मल्टीमीडिया असंवेदनशील मामला
QSGVideoNodeFactoryPlugin video/videonode Qt मल्टीमीडिया असंवेदनशील मामला
QBearerEnginePlugin bearer Qt नेटवर्क अक्षर संवेदनशील
QPlatformInputContextPlugin platforminputcontexts क्यूटी प्लेटफार्म अमूर्त असंवेदनशील मामला
QPlatformIntegrationPlugin platforms क्यूटी प्लेटफार्म अमूर्त असंवेदनशील मामला
QPlatformThemePlugin platformthemes क्यूटी प्लेटफार्म अमूर्त असंवेदनशील मामला
QGeoPositionInfoSourceFactory position क्यूटी पोजिशनिंग अक्षर संवेदनशील
QPlatformPrinterSupportPlugin printsupport Qt प्रिंट समर्थन असंवेदनशील मामला
QSGContextPlugin scenegraph क्यूटी क्विक अक्षर संवेदनशील
QScriptExtensionPlugin script क्यूटी स्क्रिप्ट अक्षर संवेदनशील
QSensorGesturePluginInterface sensorgestures Qt सेंसर अक्षर संवेदनशील
QSensorPluginInterface sensors Qt सेंसर अक्षर संवेदनशील
QSqlDriverPlugin sqldrivers क्यूटी एसक्यूएल अक्षर संवेदनशील
QIconEnginePlugin iconengines क्यूटी एसवीजी असंवेदनशील मामला
QAccessiblePlugin accessible क्यूटी विजेट अक्षर संवेदनशील
QStylePlugin styles क्यूटी विजेट असंवेदनशील मामला

यदि आपके पास MyStyle नामक एक नई शैली की क्लास है जिसे आप एक प्लगइन के रूप में उपलब्ध कराना चाहते हैं, तो क्लास को निम्न प्रकार से परिभाषित किया जाना चाहिए ( mystyleplugin.h ):

class MyStylePlugin : public QStylePlugin
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QStyleFactoryInterface" FILE "mystyleplugin.json")
public:
    QStyle *create(const QString &key);
};

सुनिश्चित करें कि वर्ग कार्यान्वयन .cpp फ़ाइल में स्थित है:

#include "mystyleplugin.h"

QStyle *MyStylePlugin::create(const QString &key)
{
    if (key.toLower() == "mystyle")
        return new MyStyle;
    return 0;
}

(ध्यान दें कि QStylePlugin केस-असंवेदनशील है, और कुंजी का QStylePlugin संस्करण हमारे create() कार्यान्वयन में उपयोग किया जाता है; अधिकांश अन्य प्लग इन केस संवेदनशील होते हैं।)

इसके अलावा, एक mystyleplugin.json फाइल ( mystyleplugin.json ) जिसमें मेटा डेटा का वर्णन किया गया है, जिसमें प्लगइन्स को ज्यादातर प्लगइन्स के लिए आवश्यक है। शैली प्लगइन्स के लिए इसमें बस उन शैलियों की सूची शामिल होती है जो प्लगइन द्वारा बनाई जा सकती हैं:

{ "Keys": [ "mystyleplugin" ] }

जिस प्रकार की जानकारी को json फाइल में प्रदान करने की आवश्यकता होती है, वह प्लग इन पर निर्भर है, कृपया उस फ़ाइल पर निहित जानकारी के विवरण के लिए वर्ग प्रलेखन देखें।

डेटाबेस ड्राइवर, छवि प्रारूप, पाठ कोडेक्स, और अधिकांश अन्य प्लगइन प्रकारों के लिए, कोई स्पष्ट ऑब्जेक्ट निर्माण की आवश्यकता नहीं है। Qt आवश्यक के रूप में उन्हें ढूंढेगा और बनाएगा। शैलियाँ एक अपवाद हैं, क्योंकि आप एक शैली को कोड में स्पष्ट रूप से सेट करना चाह सकते हैं। एक शैली लागू करने के लिए, इस तरह कोड का उपयोग करें:

QApplication::setStyle(QStyleFactory::create("MyStyle"));

कुछ प्लगइन कक्षाओं को लागू करने के लिए अतिरिक्त कार्यों की आवश्यकता होती है। वर्चुअल फ़ंक्शंस के विवरण के लिए क्लास प्रलेखन देखें, जिसे प्रत्येक प्रकार के प्लगइन के लिए फिर से लागू किया जाना चाहिए।

स्टाइल प्लगइन उदाहरण से पता चलता है कि QStylePlugin बेस क्लास को QStylePlugin प्लगइन को कैसे लागू किया QStylePlugin

निम्न-स्तरीय एपीआई: विस्तार क्यूटी अनुप्रयोग

न केवल Qt बल्कि प्लगइन्स के माध्यम से भी Qt एप्लिकेशन को बढ़ाया जा सकता है। इसके लिए QPluginLoader का उपयोग करके प्लगइन्स का पता लगाने और लोड करने के लिए एप्लिकेशन की आवश्यकता होती है। उस संदर्भ में, प्लगइन्स मनमाने ढंग से कार्यक्षमता प्रदान कर सकते हैं और डेटाबेस ड्राइवरों, छवि प्रारूपों, टेक्स्ट कोडेक्स, शैलियों, और अन्य प्रकार के प्लगइन तक सीमित नहीं हैं जो Qt की कार्यक्षमता का विस्तार करते हैं।

प्लगइन्स के माध्यम से किसी एप्लिकेशन को एक्स्टेंसिबल बनाने में निम्नलिखित चरण शामिल हैं:

  1. प्लगइन्स से बात करने के लिए उपयोग किए जाने वाले इंटरफेस (केवल शुद्ध आभासी कार्यों के साथ कक्षाएं) के एक सेट को परिभाषित करें।
  2. Qt के मेटा-ऑब्जेक्ट सिस्टम को इंटरफ़ेस के बारे में बताने के लिए Q_DECLARE_INTERFACE () मैक्रो का उपयोग करें।
  3. प्लगइन्स को लोड करने के लिए एप्लिकेशन में QPluginLoader का उपयोग करें।
  4. यह जांचने के लिए कि एक प्लगइन दिए गए इंटरफ़ेस को लागू करता है या नहीं, qobject_cast () का उपयोग करें।

प्लगइन लिखने में ये चरण शामिल हैं:

  1. एक प्लगइन वर्ग घोषित करें जो QObject से प्राप्त QObject और उन इंटरफेस से जो प्लगइन प्रदान करना चाहता है।
  2. इंटरफेस के बारे में क्यूटी के मेटा-ऑब्जेक्ट सिस्टम को बताने के लिए Q_INTERFACES () मैक्रो का उपयोग करें।
  3. Q_PLUGIN_METADATA () मैक्रो का उपयोग करके प्लगइन निर्यात करें।
  4. एक उपयुक्त .pro फ़ाइल का उपयोग करके प्लगइन का निर्माण करें।

उदाहरण के लिए, यहां इंटरफ़ेस क्लास की परिभाषा है:

class FilterInterface
{
public:
    virtual ~FilterInterface() {}

    virtual QStringList filters() const = 0;
    virtual QImage filterImage(const QString &filter, const QImage &image,
                               QWidget *parent) = 0;
};

यहाँ एक प्लगइन वर्ग की परिभाषा है जो उस इंटरफ़ेस को लागू करता है:

#include <QObject>
#include <QtPlugin>
#include <QStringList>
#include <QImage>

#include <plugandpaint/interfaces.h>

class ExtraFiltersPlugin : public QObject, public FilterInterface
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.Examples.PlugAndPaint.FilterInterface" FILE "extrafilters.json")
    Q_INTERFACES(FilterInterface)

public:
    QStringList filters() const;
    QImage filterImage(const QString &filter, const QImage &image,
                       QWidget *parent);
};

प्लग एंड पेंट उदाहरण प्रलेखन इस प्रक्रिया को विस्तार से बताता है। Qt डिज़ाइनर के लिए विशिष्ट समस्याओं के बारे में जानकारी के लिए Qt डिज़ाइनर के लिए कस्टम विजेट बनाना भी देखें। आप इको प्लगिन उदाहरण पर भी एक नज़र डाल सकते हैं जो एक प्लगइन को लागू करने के तरीके पर अधिक तुच्छ उदाहरण है जो QQ अनुप्रयोगों को बढ़ाता है। कृपया ध्यान दें कि प्लगइन्स लोड होने से पहले QCoreApplication को इनिशियलाइज़ किया जाना चाहिए था।

प्लगइन्स का पता लगाना

Qt एप्लिकेशन स्वचालित रूप से जानते हैं कि कौन से प्लगइन्स उपलब्ध हैं, क्योंकि प्लगइन्स मानक प्लगइन उपनिर्देशिकाओं में संग्रहीत हैं। क्योंकि इस एप्लिकेशन को प्लगइन्स को खोजने और लोड करने के लिए किसी भी कोड की आवश्यकता नहीं है, क्योंकि Qt उन्हें स्वचालित रूप से संभालता है।

विकास के दौरान, प्लगइन्स के लिए निर्देशिका QTDIR/plugins (जहां QTDIR वह निर्देशिका है जहां क्यूटी स्थापित है), प्रत्येक प्रकार के प्लगइन के साथ उस प्रकार के लिए एक उपनिर्देशिका में, उदाहरण के लिए, styles । यदि आप प्लगइन्स का उपयोग करने के लिए अपने एप्लिकेशन चाहते हैं और आप मानक प्लगइन्स पथ का उपयोग नहीं करना चाहते हैं, तो अपनी इंस्टॉलेशन प्रक्रिया से आप वे प्लगइन्स का उपयोग करना चाहते हैं और पथ को सहेजना चाहते हैं, उदाहरण के लिए, QSettings का उपयोग करके, पथ को सहेजें। यह चलता है जब पढ़ने के लिए आवेदन। तब एप्लिकेशन इस पथ के साथ QCoreApplication::addLibraryPath () को कॉल कर सकता है और आपके प्लग इन एप्लिकेशन के लिए उपलब्ध होगा। ध्यान दें कि पथ का अंतिम भाग (उदाहरण के लिए, styles ) नहीं बदला जा सकता है।

यदि आप चाहते हैं कि प्लगइन लोड करने योग्य हो, तो एक दृष्टिकोण एप्लिकेशन के तहत एक उपनिर्देशिका बनाना है, और उस निर्देशिका में प्लगइन को रखना है। यदि आप किसी भी प्लगइन्स को वितरित करते हैं जो Qt ( plugins डायरेक्टरी में स्थित हैं) के साथ आते हैं, तो आपको उन plugins तहत उपनिर्देशिका को कॉपी करना होगा जहां प्लगइन आपके एप्लिकेशन रूट फ़ोल्डर में स्थित है (यानी, plugins डायरेक्टरी को शामिल नहीं करें)।

परिनियोजन के बारे में अधिक जानकारी के लिए, Qt अनुप्रयोग परिनियोजन और प्लगइन्स दस्तावेज़ परिनियोजन देखें

स्थैतिक प्लगइन्स

एक आवेदन के साथ एक प्लगइन को शामिल करने का सामान्य और सबसे लचीला तरीका यह है कि इसे एक गतिशील लाइब्रेरी में संकलित किया जाए जो अलग-अलग शिप किया गया हो, और रनटाइम पर पता लगाया और लोड किया गया हो।

प्लगइन्स को आपके आवेदन में सांख्यिकीय रूप से जोड़ा जा सकता है। यदि आप Qt का स्थिर संस्करण बनाते हैं, तो यह Qt के पूर्वनिर्धारित प्लगइन्स को शामिल करने का एकमात्र विकल्प है। स्थैतिक प्लगइन्स का उपयोग करने से तैनाती कम त्रुटि-रहित हो जाती है, लेकिन इसका नुकसान यह है कि प्लगइन्स से कोई कार्यक्षमता पूर्ण पुनर्निर्माण और एप्लिकेशन के पुनर्वितरण के बिना नहीं जोड़ी जा सकती है।

प्लगइन्स को QTPLUGIN लिंक करने के लिए, आपको QTPLUGIN का उपयोग करके अपने बिल्ड में आवश्यक प्लगइन्स को QTPLUGIN

अपने आवेदन के लिए .pro फ़ाइल में, आपको निम्न प्रविष्टि की आवश्यकता है:

QTPLUGIN     += qjpeg \
                qgif \
                qkrcodecs

Qmake स्वचालित रूप से QTPLUGIN में प्लगइन्स जोड़ता है जो आम तौर पर उपयोग किए जाने वाले Qt मॉड्यूल द्वारा आवश्यक होते हैं ( QT देखें), जबकि अधिक विशिष्ट प्लगइन्स को मैन्युअल रूप से जोड़ने की आवश्यकता होती है। स्वचालित रूप से जोड़े गए प्लगइन्स की डिफ़ॉल्ट सूची प्रति प्रकार ओवरराइड की जा सकती है। उदाहरण के लिए, डिफ़ॉल्ट Qt प्लेटफ़ॉर्म अनुकूलन प्लगइन के बजाय न्यूनतम प्लगइन लिंक करने के लिए, उपयोग करें:

QTPLUGIN.platforms = qminimal

यदि आप न तो डिफ़ॉल्ट चाहते हैं, और न ही न्यूनतम QPA प्लगइन स्वचालित रूप से जुड़ा हुआ है, तो उपयोग करें:

QTPLUGIN.platforms = -

चूक एक इष्टतम आउट-ऑफ-द-बॉक्स अनुभव की ओर देखते हैं, लेकिन अनावश्यक रूप से एप्लिकेशन को ब्लोट कर सकते हैं। क्यूमेक द्वारा निर्मित लिंकर कमांड लाइन का निरीक्षण करने और अनावश्यक प्लगइन्स को खत्म करने की सिफारिश की गई है।

स्थैतिक प्लगइन्स को जोड़ने का विवरण

स्थैतिक प्लग-इन को वास्तव में लिंक और Q_IMPORT_PLUGIN किए जाने का कारण बनने के लिए, Q_IMPORT_PLUGIN () मैक्रोज़ को एप्लिकेशन कोड में भी आवश्यक है, लेकिन वे स्वचालित रूप से qmake द्वारा उत्पन्न होते हैं और आपके एप्लिकेशन प्रोजेक्ट में जोड़े जाते हैं।

यदि आप नहीं चाहते हैं कि QTPLUGIN में जोड़े गए सभी प्लगइन्स स्वचालित रूप से लिंक किए जाएं, तो CONFIG चर से import_plugins निकालें:

CONFIG -= import_plugins

स्थैतिक प्लगइन्स बनाना

इन चरणों का पालन करके अपने स्वयं के स्थिर प्लगइन्स बनाना भी संभव है:

  1. CONFIG += static को अपने plugin की .pro फ़ाइल में जोड़ें।
  2. अपने आवेदन में Q_IMPORT_PLUGIN () मैक्रो का उपयोग करें।
  3. प्लग इन qrc फ़ाइलों को अपने आवेदन में Q_INIT_RESOURCE () मैक्रो का उपयोग करें।
  4. .pro फ़ाइल में LIBS का उपयोग करके अपने एप्लिकेशन को अपनी प्लगइन लाइब्रेरी से लिंक करें।

ऐसा करने के तरीके के विवरण के लिए प्लग एंड पेंट उदाहरण और संबंधित बुनियादी उपकरण प्लगइन देखें।

नोट: यदि आप अपने प्लगइन का निर्माण करने के लिए qmake का उपयोग नहीं कर रहे हैं, तो आपको यह सुनिश्चित करने की आवश्यकता है कि QT_STATICPLUGIN प्रीप्रोसेसर मैक्रो परिभाषित है।

तैनात और प्लगइन्स डिबगिंग

डिप्लॉयिंग प्लगइन्स दस्तावेज़ में प्लगइन्स को अनुप्रयोग के साथ परिनियोजित करने और समस्या आने पर उन्हें डीबग करने की प्रक्रिया को शामिल किया गया है।

QPluginLoader , QLibrary और प्लग एंड पेंट उदाहरण भी देखें