2012-01-24 12 views
5

Quindi in pratica ho una piccola applicazione che carica due plug-in e connect. Primo plugin dopo averlo caricato crea un'etichetta senza titolo che verrà aggiunta alla finestra principale. Il secondo plugin crea un'azione che verrà aggiunta a un menu. Quindi la mia app ha bisogno solo di caricare questi plugin e di li connect. Cosa intendo collegandoli? Voglio dire che il plug-in dell'etichetta contiene uno slot che modificherà il titolo dell'etichetta, e il plug-in di azione ha dichiarato un segnale. L'applicazione dovrebbe inviare il segnale del plug-in di azione connect con lo slot per le etichette. Non so come farlo esattamente. La mia ipotesi è che in action plugin l'implementazione della classe sia quella di connettere il segnale personalizzato con un segnale standart (attivato). Ma comunque in questo modo la mia app non funziona come mi aspettavo. Come posso creare una connessione corretta nella mia app per un segnale da un plugin e slot da un altro plug-in?Interazione segnale/slot per due plug-in in Qt

Ecco il mio codice per Plugin Etichetta:

#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) 

Azione Plugin:

#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) 

Nella mia app, dove cerco di caricare i plugin che ho:

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

Questo probabilmente non farà alcuna differenza, ma forse prova 'label _-> connect (_action, SIGNAL (pushMyAction()));' –

+0

non si verificano errori di connessione sull'output della console? –

+0

Poiché Qt5 'Q_EXPORT_PLUGIN2' è obsoleto. – ManuelSchneid3r

risposta

3

È è necessario poter accedere a un'istanza QObject da ciascun plug-in per poterlo utilizzare nella chiamata di connessione. Vorrei aggiungere metodi alle tue interfacce per farlo. Un modello che ho visto è un operatore di convertire l'interfaccia per un puntatore QObject, come:

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

Opinioni possono variare se questo è un bene lo stile, ma risolve il problema (se non ti piace l'operatore , usa un metodo chiamato asQObject() o simile).

+0

Incidentalmente ho incontrato lo stesso problema. A volte vuoi 'qobject_cast' i tuoi plug-in ed è sempre necessario lanciarli prima su' QObject' e può diventare molto fastidioso. – pmr

+0

QPluginLoader :: instance li restituisce come QObjects, non capisco perché dovresti ricondurli a QObject? –

+0

Perché in generale dovresti eseguire qobject_casting sulla tua interfaccia e utilizzarla, e non c'è modo di restituirlo a QObject. Ovviamente puoi passare un QObject * e un MyInterface * ovunque, ma anche questo è scomodo. –

Problemi correlati