2012-01-24 12 views
5

में दो प्लग-इन के लिए/स्लॉट बातचीत तो बुनियादी तौर पर मैं एक छोटे से आवेदन है कि दो प्लगइन्स और उन्हें connect लोड करता है। लोड होने के बाद पहली प्लगइन यह किसी भी शीर्षक के बिना एक लेबल बनाता है जिसे मुख्य विंडो में जोड़ा जाएगा। दूसरी प्लगइन एक क्रिया बनाता है जो मेनू में जोड़ा जाएगा। तो मेरे ऐप को इन प्लगइन्स को लोड करने और connect को लोड करने की आवश्यकता है। उन्हें जोड़ने से मेरा क्या मतलब है? मेरा मतलब है कि लेबल प्लगइन में एक स्लॉट होता है जो लेबल के शीर्षक को संशोधित करेगा, और एक्शन प्लगइन में सिग्नल घोषित किया गया है। आवेदन connect लेबल स्लॉट के साथ कार्रवाई प्लगइन संकेत होना चाहिए। मुझे नहीं पता कि यह वास्तव में कैसे करें। मेरा अनुमान है कि कार्रवाई प्लगइन वर्ग कार्यान्वयन में एक स्टैंडएट सिग्नल (ट्रिगर) के साथ कस्टम सिग्नल कनेक्ट करना है। लेकिन वैसे भी मेरे ऐप काम नहीं कर रहा है जैसा कि मैंने उम्मीद की थी। मैं एक प्लगइन से एक सिग्नल और किसी अन्य प्लगइन से स्लॉट के लिए अपने ऐप में एक सही कनेक्शन कैसे बना सकता हूं ??सिग्नल क्यूटी

यहाँ लेबल प्लगइन के लिए अपने कोड है:

#include "LabelInterface.h" 

class LabelPlugin : public LabelInterface { 

    Q_OBJECT 
    Q_INTERFACES(LabelInterface) 

public: 
    QLabel* label; 
    QLabel* newLabel(); 
    LabelPlugin() {} 
    ~LabelPlugin() {} 

public slots: 
    void setTextforLabel(); 
}; 

#include <QtGui> 
#include "LabelPlugin.h" 

QLabel* LabelPlugin::newLabel() { 

    label = new QLabel(""); 
    return label; 
} 

void LabelPlugin::setTextforLabel() { 

    label->setText("This plugin works fine"); 
} 

// Exporta plugin-ul 
Q_EXPORT_PLUGIN2 (labelplugin,LabelPlugin) 

कार्रवाई प्लगइन:

#include "ActionInterface.h" 

    class ActionPlugin : public ActionInterface { 

     Q_OBJECT 
     Q_INTERFACES (ActionInterface) 

    public : 
     QAction* myAction; 
     QAction* newAction(); 

     ~ActionPlugin() {} 
     ActionPlugin() {} 

    public slots: 
     void send_signal(); 

    signals : 
     void pushMyAction(); 
    }; 

#include <QtGui> 
#include "ActionPlugin.h" 

QAction* ActionPlugin::newAction() { 

    myAction = new QAction("Show text",this); 

    return myAction; 
} 

void ActionPlugin::send_signal() { 

    qDebug()<<"Here"; 

    QAction::connect (this,SIGNAL(pushMyAction()),this,SIGNAL(triggered())); 
} 

Q_EXPORT_PLUGIN2 (actionplugin,ActionPlugin) 

मेरे ऐप है, जहां मैं लोड करने का प्रयास में प्लगइन्स मेरे पास है:

foreach (QString fileName, appDir.entryList(QDir::Files)) { 

     qDebug()<<QString(fileName); 

     QPluginLoader pluginLoader(appDir.absoluteFilePath(fileName)); 

     QObject* plugin = pluginLoader.instance(); 

     if (plugin) { 

      ActionInterface* myAction= qobject_cast<ActionInterface*>(plugin); 

      if (myAction) { 
       action_ = myAction; 
       pluginMenu->addAction(action_->newAction()); 
      } 

      LabelInterface* myLabel = qobject_cast<LabelInterface*>(plugin); 

      if (myLabel) { 
       label_=myLabel; 
       layout->addWidget(label_->newLabel()); 
      } 

      if (action_ && label_) { 

       qDebug()<<"both loaded"; 

       action_->send_signal(); 
       connect(action_, SIGNAL(pushMyAction()),label_, SLOT(setTextforLabel())); 
      } 
      else qDebug() << "seems one plugin is not loaded"; 
     } 
    } 
+0

यह शायद कोई फर्क नहीं पड़ता है, लेकिन शायद 'लेबल _-> कनेक्ट (_action, SIGNAL (pushMyAction())); ' –

+0

क्या आपको कंसोल आउटपुट पर कोई कनेक्ट त्रुटियां नहीं मिलती हैं? –

+0

चूंकि Qt5 'Q_EXPORT_PLUGIN2' बहिष्कृत है। – ManuelSchneid3r

उत्तर

3

आप प्रत्येक प्लगइन से QObject उदाहरण तक पहुंचने में सक्षम होने की आवश्यकता है ताकि आप इसे कनेक्ट कॉल में उपयोग कर सकें। ऐसा करने के लिए मैं आपके इंटरफेस में विधियों को जोड़ूंगा। एक पैटर्न मैंने देखा है, एक ऑपरेटर एक QObject सूचक के लिए इंटरफ़ेस कन्वर्ट करने के लिए है की तरह:

class MyInterface { 
public: 
    virtual operator QObject*() = 0; 
}; 

विचार है कि क्या है कि अच्छी शैली है, लेकिन यह समस्या का हल (यदि आप ऑपरेटर पसंद नहीं है पर भिन्न हो सकते हैं , asQObject() या इसी तरह की विधि का उपयोग करें)।

+0

संयोग से मैं एक ही समस्या में भाग गया है। कभी-कभी आप अपने प्लग-इन को 'qobject_cast' करना चाहते हैं और उन्हें हमेशा' QObject' पर डालना हमेशा आवश्यक होता है और बहुत परेशान हो सकता है। – pmr

+0

QPluginLoader :: उदाहरण उन्हें QObjects के रूप में लौटाता है, मुझे समझ में नहीं आता है कि आपको उन्हें वापस QObject पर क्यों डालना होगा? –

+0

सामान्य रूप से आप अपने इंटरफ़ेस पर qobject_casting होंगे और इसका उपयोग करके, और इसे वापस QObject पर डालने का कोई तरीका नहीं है। आप निश्चित रूप से एक QObject * और एक MyInterface * पास कर सकते हैं लेकिन यह भी अजीब है। –

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