IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Comment émettre un signal depuis un plugin et s'y connecter dans le programme principal ?


Sujet :

Qt

  1. #1
    Membre du Club Avatar de nant13
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 61
    Points : 43
    Points
    43
    Par défaut Comment émettre un signal depuis un plugin et s'y connecter dans le programme principal ?
    Bonjour,
    J'ai créé un plugin avec qt, et j'aimerai faire communiquer ce plugin avec le programme principal en utilisant des signaux.
    Le problème est que quand je me connecte au signal dans le programme, j'ai une erreur à la compilation !!!

    Voici le code de mon l'interface:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    #ifndef PLUGININTERFACE_H
    #define PLUGININTERFACE_H
     
    #include <QObject>
    #include <QString>
     
    class PluginInterface
    {
    public:
        virtual ~PluginInterface() = default;
        virtual QString getDataXml() = 0;
        virtual QString pluginName() = 0;
        virtual QList<QString> execAction(QList<QString> cmd) = 0;
    };
     
     
    QT_BEGIN_NAMESPACE
     
    #define PluginInterface_iid "fr.swiftapp.linux.plugin.HelloWord"
     
    Q_DECLARE_INTERFACE(PluginInterface, PluginInterface_iid)
     
    QT_END_NAMESPACE
     
    #endif
    Du Plugin.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    #ifndef HELLOWORDPLUGIN_H
    #define HELLOWORDPLUGIN_H
     
    #include <QObject>
    #include <QtPlugin>
    #include "plugininterface.h"
     
    class HelloWordPlugin : public QObject, PluginInterface
    {
        Q_OBJECT
        Q_PLUGIN_METADATA(IID "fr.swiftapp.linux.plugin.HelloWord" FILE "hellowordplugin.json")
        Q_INTERFACES(PluginInterface)
     
    public:
        QString getDataXml() override;
        QString pluginName() override;
        QList<QString> execAction(QList<QString> cmd) override;
    };
     
    #endif
    Du Plugin.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    #include "hellowordplugin.h"
     
    #include <QFile>
     
    QString HelloWordPlugin::getDataXml()
    {
        QFile file(":/XML/Data.xml");
        file.open(QIODevice::ReadOnly);
     
        return file.readAll();
    }
     
    QString HelloWordPlugin::pluginName()
    {
        return "Hello Word";
    }
     
    QList<QString> HelloWordPlugin::execAction(QList<QString> cmd) {
     
    }
    Du coup, si quelqu'un sait comment faire, je suis preneur !!!
    Merci d'avance !
    Cookie : Anciennement petit gâteau sucré, qu'on acceptait avec plaisir. Aujourd'hui : petit fichier informatique drôlement salé, qu'il faut refuser avec véhémence.

    Mon projet GitHub: https://github.com/Swiftapp-hub/Swifty-Assistant

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Et l'erreur à la compilation elle dit quoi ?

    Pourquoi tu dérive QObject
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class HelloWordPlugin : public QObject, PluginInterface

  3. #3
    Membre du Club Avatar de nant13
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Merci de ta réponse !

    Voilà le code que j'ai essayé:

    PluginInterface.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    #ifndef PLUGININTERFACE_H
    #define PLUGININTERFACE_H
     
    #include <QObject>
    #include <QString>
     
    class PluginInterface
    {
    public:
        virtual ~PluginInterface() = default;
        virtual QString getDataXml() = 0;
        virtual QString pluginName() = 0;
        virtual QList<QString> execAction(QList<QString> cmd) = 0;
     
    signals:
        virtual void my_signal();
    };
     
     
    QT_BEGIN_NAMESPACE
     
    #define PluginInterface_iid "fr.swiftapp.linux.plugin.HelloWord"
     
    Q_DECLARE_INTERFACE(PluginInterface, PluginInterface_iid)
     
    QT_END_NAMESPACE
     
    #endif
    Plugin.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    #ifndef ECHOPLUGIN_H
    #define ECHOPLUGIN_H
     
    #include <QObject>
    #include <QtPlugin>
    #include "plugininterface.h"
     
    class HelloWordPlugin : public QObject, PluginInterface
    {
        Q_OBJECT
        Q_PLUGIN_METADATA(IID "fr.swiftapp.linux.plugin.HelloWord" FILE "hellowordplugin.json")
        Q_INTERFACES(PluginInterface)
     
    public:
        QString getDataXml() override;
        QString pluginName() override;
        QList<QString> execAction(QList<QString> cmd) override;
     
    signals:
        void my_signal() override;
    };
     
    #endif
    Plugin.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    #include "hellowordplugin.h"
     
    #include <QFile>
     
    QString HelloWordPlugin::getDataXml()
    {
        QFile file(":/XML/Data.xml");
        file.open(QIODevice::ReadOnly);
     
        return file.readAll();
    }
     
    QString HelloWordPlugin::pluginName()
    {
        return "Hello Word";
    }
     
    QList<QString> HelloWordPlugin::execAction(QList<QString> cmd) {
        emit my_signal();
        return QList<QString>();
    }
    et le fichier Engine.cpp dans le quel je fais la connection
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    Engine::Engine(QObject *parent) : QObject(parent)
    {
        QDir pluginsDir(QCoreApplication::applicationDirPath());
        pluginsDir.cd("plugins");
        const QStringList entries = pluginsDir.entryList(QDir::Files);
     
        for (const QString &fileName : entries) {
            QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
            QObject *plugin = pluginLoader.instance();
     
            if (plugin) {
                PluginInterface *pluginsInterface = qobject_cast<PluginInterface *>(plugin);
                if (pluginsInterface) {
                    connect(pluginsInterface, &PluginInterface::my_signal, this, &Engine::my_slot); // Je fais la connection ici !
                    listPlugins.append(pluginsInterface);
                }
            }
        }
    }
     
    void Engine::my_slot()
    {
        qDebug("my_slot");
    }
    et j'ai ces erreurs:
    Nom : Capture de 2021-07-07 18:24:25.png
Affichages : 108
Taille : 122,0 Ko

    Pour le QObject, j'ai suivit l'exemple de qt sur les plugins!
    Cookie : Anciennement petit gâteau sucré, qu'on acceptait avec plaisir. Aujourd'hui : petit fichier informatique drôlement salé, qu'il faut refuser avec véhémence.

    Mon projet GitHub: https://github.com/Swiftapp-hub/Swifty-Assistant

  4. #4
    Invité
    Invité(e)
    Par défaut
    je pense qu'il manque un Q_OBJECT dans engine.h
    Message est clair en plus il te donne bien les fichiers avec problème '/swift/engine.h'

  5. #5
    Membre du Club Avatar de nant13
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Pourtant, dans mon fichier Engine.h, j'ai bien mis le Q_OBJECT
    Cookie : Anciennement petit gâteau sucré, qu'on acceptait avec plaisir. Aujourd'hui : petit fichier informatique drôlement salé, qu'il faut refuser avec véhémence.

    Mon projet GitHub: https://github.com/Swiftapp-hub/Swifty-Assistant

  6. #6
    Membre du Club Avatar de nant13
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Bonjour,

    J'ai finalement trouvé la réponse !
    Il fallait mettre une fonction qui retourne une instance du plugin !

    Voilà le code modifié au cas où:

    PluginInterface.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    #ifndef PLUGININTERFACE_H
    #define PLUGININTERFACE_H
     
    #include <QObject>
    #include <QString>
     
    class PluginInterface
    {
    public:
        virtual ~PluginInterface() = default;
        virtual QString getDataXml() = 0;
        virtual QString pluginName() = 0;
        virtual QList<QString> execAction(QList<QString> cmd) = 0;
     
        virtual QObject* getObject() = 0;    //Changement ici !
     
    signals:
        virtual void my_signal();
    };
     
     
    QT_BEGIN_NAMESPACE
     
    #define PluginInterface_iid "fr.swiftapp.linux.plugin.HelloWord"
     
    Q_DECLARE_INTERFACE(PluginInterface, PluginInterface_iid)
     
    QT_END_NAMESPACE
     
    #endif
    Plugin.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    #ifndef ECHOPLUGIN_H
    #define ECHOPLUGIN_H
     
    #include <QObject>
    #include <QtPlugin>
    #include "plugininterface.h"
     
    class HelloWordPlugin : public QObject, PluginInterface
    {
        Q_OBJECT
        Q_PLUGIN_METADATA(IID "fr.swiftapp.linux.plugin.HelloWord" FILE "hellowordplugin.json")
        Q_INTERFACES(PluginInterface)
     
    public:
        QString getDataXml() override;
        QString pluginName() override;
        QList<QString> execAction(QList<QString> cmd) override;
     
        QObject* getObject() { return this; } // Changement ici !
     
    signals:
        void my_signal() override;
    };
     
    #endif
    Plugin.cpp (Aucun changement):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    #include "hellowordplugin.h"
     
    #include <QFile>
     
    QString HelloWordPlugin::getDataXml()
    {
        QFile file(":/XML/Data.xml");
        file.open(QIODevice::ReadOnly);
     
        return file.readAll();
    }
     
    QString HelloWordPlugin::pluginName()
    {
        return "Hello Word";
    }
     
    QList<QString> HelloWordPlugin::execAction(QList<QString> cmd) {
        emit my_signal();
        return QList<QString>();
    }
    et le fichier Engine.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    Engine::Engine(QObject *parent) : QObject(parent)
    {
        QDir pluginsDir(QCoreApplication::applicationDirPath());
        pluginsDir.cd("plugins");
        const QStringList entries = pluginsDir.entryList(QDir::Files);
     
        for (const QString &fileName : entries) {
            QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
            QObject *plugin = pluginLoader.instance();
     
            if (plugin) {
                PluginInterface *pluginsInterface = qobject_cast<PluginInterface *>(plugin);
                if (pluginsInterface) {
                    connect(pluginsInterface->getObject(), SIGNAL(sendMessage()), this, SLOT(sendReply())); //Changement ici !
                    listPlugins.append(pluginsInterface);
                }
            }
        }
    }
     
    void Engine::my_slot()
    {
        qDebug("my_slot");
    }
    Cookie : Anciennement petit gâteau sucré, qu'on acceptait avec plaisir. Aujourd'hui : petit fichier informatique drôlement salé, qu'il faut refuser avec véhémence.

    Mon projet GitHub: https://github.com/Swiftapp-hub/Swifty-Assistant

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 10/01/2012, 21h40
  2. Réponses: 6
    Dernier message: 26/06/2011, 18h04
  3. Réponses: 6
    Dernier message: 12/01/2010, 15h52
  4. Réponses: 1
    Dernier message: 15/09/2006, 11h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo