Qt "sygnały" jest synonimem do "zabezpieczone". Ale pomaga MOC generować niezbędny kod. Tak więc, jeśli potrzebujesz interfejsu z pewnymi sygnałami - powinieneś zadeklarować je jako wirtualne abstrakcyjne metody chronione. Cały niezbędny kod zostanie wygenerowany przez MOC - możesz zobaczyć szczegóły, że "emituj somesignal" zostanie zastąpione wirtualnym wywołaniem metody chronionej o tej samej nazwie. Zauważ, że ciało metody aslo generowane przez Qt.
UPDATE: kod próbki:
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();
}
Możesz napisać tylko 'sygnały: void someThingHappened();'. To nie jest potrzebne Wdrożenie sygnału. – Ruu
Wiem, że sygnał jest generowany podczas implementacji, ale jak obserwujący wie, że jest to sygnał (qt), jeśli znany jest tylko interfejs? – Beachwalker
@Beachwalker Zastąpiłem chronione słowo kluczowe sygnałami w mojej odpowiedzi. To najedzie na Twoje pytanie. –