2012-01-24 13 views
5

Así que, básicamente, tengo una pequeña aplicación que carga dos complementos y connect. El primer complemento después de cargarse crea una etiqueta sin ningún título que se agregará a la ventana principal. El segundo complemento crea una acción que se agregará a un menú. Entonces mi aplicación solo necesita cargar estos complementos y connect. ¿Qué quiero decir conectándolos? me refiero a que el complemento de etiqueta contiene una ranura que modificará el título de la etiqueta, y el complemento de acción tiene una señal declarada. Aplicación debe connect señal de complemento de acción con ranura de etiqueta. No sé cómo hacerlo exactamente. Supongo que en la implementación de la clase de plugin de acción es conectar la señal personalizada con una señal estándar (disparada). Pero de todos modos, mi aplicación no funciona como esperaba. ¿Cómo puedo hacer una conexión correcta en mi aplicación para obtener una señal de un complemento y una ranura de otro complemento?Interacción señal/ranura para dos complementos en Qt

Aquí está mi código para Plugin Etiqueta:

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

Acción 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) 

En mi aplicación, donde trato de cargar plugins que tengo:

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

Esto probablemente no hará ninguna diferencia, pero quizás intente 'label _-> connect (_action, SIGNAL (pushMyAction()));' –

+0

¿No obtiene ningún error de conexión en la salida de la consola? –

+0

Dado que Qt5 'Q_EXPORT_PLUGIN2' está en desuso. – ManuelSchneid3r

Respuesta

3

Usted necesita poder acceder a una instancia de QObject desde cada complemento para que pueda usarlo en la llamada de conexión. Agregaría métodos a sus interfaces para hacer esto. Uno de los dibujos que he visto es un operador para convertir la interfaz a un puntero QObject, como:

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

opiniones pueden variar de si eso es un buen estilo, pero resuelve el problema (si no te gusta el operador , use un método llamado asQObject() o similar).

+0

Por cierto, me he encontrado con el mismo problema. A veces quieres 'qobject_cast' tus complementos y siempre es necesario echarlos primero a' QObject' y pueden ser muy molestos. – pmr

+0

QPluginLoader :: instance los devuelve como QObjects, no entiendo por qué tendrías que devolverlos a QObject. –

+0

Porque en general sería qobject_casting a su interfaz y usar eso, y no hay forma de devolverlo a QObject. Por supuesto, puede pasar un QObject * y un MyInterface * a todas partes, pero eso también es incómodo. –

Cuestiones relacionadas