2010-04-25 17 views
5

में प्लगइन सिस्टम बनाने की कोशिश कर रहा है मैं एक कार्य-आधारित प्रोग्राम बना रहा हूं जिसमें प्लगइन होना आवश्यक है। कार्यों में गुणों को आसानी से संपादित किया जा सकता है, मुझे लगता है कि यह क्यूटी के मेटा-ऑब्जेक्ट कंपाइलर प्रतिबिंब क्षमताओं के साथ किया जा सकता है (मैं गलत हो सकता हूं, लेकिन मुझे इसे QtPropertyBrowser में चिपकाने में सक्षम होना चाहिए?)सी ++/क्यूटी

तो यहां आधार:

class Task : public QObject 
{ 
Q_OBJECT 
public: 
    explicit Task(QObject *parent = 0) : QObject(parent){} 

    virtual void run() = 0; 

signals: 
    void taskFinished(bool success = true); 
} 

फिर एक प्लगइन इस कार्य हो सकता है:

class PrinterTask : public Task 
{ 
Q_OBJECT 
public: 
    explicit PrinterTask(QObject *parent = 0) : Task(parent) {} 

    void run() 
    { 
     Printer::getInstance()->Print(this->getData()); // fictional 
     emit taskFinished(true); 
    } 

    inline const QString &getData() const; 
    inline void setData(QString data); 

Q_PROPERTY(QString data READ getData WRITE setData) // for reflection 
} 

संक्षेप में, यहाँ मैं क्या करना चाहते हैं:

// load plugin 
// find all the Tasks interface implementations in it 
// have user able to choose a Task and edit its specific Q_PROPERTY's 
// run the TASK 

यह महत्वपूर्ण है कि एक। डीएल में कई कार्य हैं, क्योंकि मैं उन्हें अपने मॉड्यूल से जोड़ना चाहता हूं। उदाहरण के लिए, "FileTasks.dll" में फ़ाइलों को हटाने, फ़ाइलों को बनाने, आदि के लिए कार्य हो सकते हैं।

क्यूटी के प्लगइन सेटअप के साथ एकमात्र समस्या यह है कि मैं एक .dll मॉड्यूल में X की मात्रा को संग्रहीत करना चाहता हूं। जहां तक ​​मैं कह सकता हूं, आप प्रति प्लगइन केवल एक इंटरफेस लोड कर सकते हैं (मैं गलत हो सकता है?)। यदि ऐसा है, तो मैं जो करना चाहता हूं उसे पूरा करने का एकमात्र संभव तरीका है स्ट्रिंग आधारित कुंजी के साथ फैक्ट्रीइंटरफेस बनाना जो ऑब्जेक्ट्स (जैसे क्यूटी के प्लग-एंड-पेंट उदाहरण में) लौटाता है, जो एक भयानक बॉयलरप्लेट है जिसे मैं टालना चाहता हूं।

किसी को भी क्यूटी के मुकाबले एक क्लीनर सी ++ प्लगइन आर्किटेक्चर पता है जो मैं चाहता हूं?

इसके अलावा, मैं सुरक्षित रूप से क्यूटी के प्रतिबिंब क्षमताओं संभालने हूँ कि मैं क्या चाहते हो जाएगा (अर्थात भेजने से पहले QtPropertyBrowser के साथ एक अज्ञात गतिशील लोड कार्यों 'गुण संपादित करने में सक्षम)?

उत्तर

6

लगता है जैसे आप इसे एक संपूर्ण विचार दे रहे हैं, जो कि महान और आवश्यक है। मैं क्यूटी विशेष पर टिप्पणी नहीं कर सकते, लेकिन प्लगइन सलाह के इन टुकड़ों से वंचित न रहें करने के लिए, विशेष रूप से सुनिश्चित हो वर्ज़निंग: Plugin Architecture

+0

ग्रेट पढ़ा और बूट करने के लिए एक उदाहरण ढांचा समाधान। असल में यह कहता है कि आपको बॉयलरप्लेट से बचने के लिए बस एक बेहतर फैक्टरी प्रणाली की आवश्यकता है जो स्ट्रिंग कुंजी आपको देता है, मुझे लगता है कि मैं समस्या को खत्म कर रहा था। अगर मैं इसे एकीकृत कर सकता हूं तो यह शायद मेरी दुविधाओं को हल करेगा। धन्यवाद। –

4

किसी भी कारण है कि आप से बचने कर रहे हैं क्यूटी के अंतर्निहित plugin framework?

उदाहरण here

संपादित करें: माफ करना, मैं

याद किया जहां तक ​​मेरा बता सकते हैं, आप केवल प्लगइन प्रति एक अंतरफलक

से पहले लोड कर सकते हैं। plug-and-paint उदाहरण दिखाता है कि आप एक प्लगइन में कई इंटरफेस को कार्यान्वित कर सकते हैं। और मैं स्ट्रिंग आधारित कारखाने के बारे में उलझन में हूं जिसके बारे में आप बात कर रहे हैं, उदाहरण प्लगइन लोड करने के बाद QObjects, स्लॉट्स और संकेतों का उपयोग करता है। तारों का उपयोग केवल मदद मेनू में प्लगइन का नाम दिखाने के लिए किया जाता है।

+0

मेरा मतलब है कि प्लगइन में एक इंटरफ़ेस प्राप्त करने वाले कई वर्गों को आसानी से लोड करने का एक तरीका है। शायद मैं उलझन में हूं, लेकिन ऐसा लगता है कि आप केवल प्रत्येक इंटरफेस प्रकार में से एक लोड कर सकते हैं? मुझे लगता है कि एक कामकाज का उपयोग करना है। –

+0

शायद मैं भी उलझन में हूं, आप एक डीएलएल से कई प्लगइन लोड करना चाहते हैं?सबसे पहले, कम फाइलों के अलावा क्यों? दूसरा, मेरा मानना ​​है कि अगर ऐसा मामला है तो हाँ, आप सही हैं। प्रत्येक डीएलएल केवल एक प्लगइन है, लेकिन प्रत्येक प्लगइन कई इंटरफेस लागू कर सकते हैं। यदि एकमात्र कारण आप एक डीएल चाहते हैं तो कम फाइलों के लिए है, तो मैं दृढ़ता से अन्यथा सुझाव दूंगा। छोटे संकलन इकाइयां तेजी से पुन: संकलित समय और आसान परीक्षण की ओर ले जाती हैं। –

+0

प्लगइन प्रति एक डीएलएल डेवलपर और उपयोगकर्ता के लिए चीजों को अधिक सरल बनाता है। एडम के साथ पूरी तरह से सहमत हैं। –

संबंधित मुद्दे