Dans Qt, "signaux" est synonyme de "protégé". Mais cela aide le MOC à générer le code nécessaire. Donc, si vous avez besoin d'une interface avec certains signaux, vous devez les déclarer comme des méthodes protégées abstraites virtuelles. Tout le code nécessaire sera généré par MOC - vous pouvez voir les détails, que "emit somesignal" sera remplacé par l'appel virtuel de la méthode protégée avec le même nom. Notez, que le corps de avec la méthode aussi générée par Qt.
UPDATE: Exemple de code:
MyInterfaces.h
#pragma once
struct MyInterface1
{
signals:
virtual void event1() = 0;
};
struct MyInterface2
{
signals:
virtual void event2() = 0;
};
MyImpl.h
#ifndef MYIMPL_H
#define MYIMPL_H
#include <QObject>
#include "MyInterfaces.h"
class MyImpl
: public QObject
, public MyInterface1
, public MyInterface2
{
Q_OBJECT
public:
MyImpl(QObject *parent);
~MyImpl();
void doWork();
signals:
void event1();
void event2();
};
class MyListner
: public QObject
{
Q_OBJECT
public:
MyListner(QObject *parent);
~MyListner();
public slots:
void on1();
void on2();
};
#endif // MYIMPL_H
MyImpl.cpp
#include "MyImpl.h"
#include <QDebug>
MyImpl::MyImpl(QObject *parent)
: QObject(parent)
{}
MyImpl::~MyImpl()
{}
void MyImpl::doWork()
{
emit event1();
emit event2();
}
MyListner::MyListner(QObject *parent)
{}
MyListner::~MyListner()
{}
void MyListner::on1()
{
qDebug() << "on1";
}
void MyListner::on2()
{
qDebug() << "on2";
}
main.cpp
#include <QCoreApplication>
#include "MyImpl.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyImpl *invoker = new MyImpl(NULL);
MyListner *listner = new MyListner(NULL);
MyInterface1 *i1 = invoker;
MyInterface2 *i2 = invoker;
// i1, i2 - not QObjects, but we are sure, that they will be.
QObject::connect(dynamic_cast< QObject * >(i1), SIGNAL(event1()), listner, SLOT(on1()));
QObject::connect(dynamic_cast< QObject * >(i2), SIGNAL(event2()), listner, SLOT(on2()));
invoker->doWork();
return a.exec();
}
Vous pouvez écrire uniquement 'signals: void quelquechoseHappened();'. Ce n'est pas nécessaire Mise en œuvre du signal. – Ruu
Je sais que le signal est généré dans l'implémentation mais comment l'observateur sait-il qu'il s'agit d'un signal (qt) s'il n'y a que l'interface connue? – Beachwalker
@Beachwalker J'ai remplacé le mot-clé protégé par des signaux dans ma réponse. Il planera ta question. –