В Qt «сигналы» являются синонимами для «защищенных». Но это помогает MOC генерировать необходимый код. Итак, если вам нужен интерфейс с некоторыми сигналами - вы должны объявить их как виртуальные абстрактные защищенные методы. Весь необходимый код будет создан MOC - вы можете увидеть подробности, что «emit somesignal» будет заменен виртуальным вызовом защищенного метода с тем же именем. Обратите внимание, что тело с методом также генерируется Qt.
UPDATE: Код Пример:
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();
}
Вы можете написать только 'сигналы: void someThingHappened();'. Это не требуется. Реализация сигнала. – Ruu
Я знаю, что сигнал генерируется в реализации, но как наблюдающий знает, что это сигнал (qt), если известен только интерфейс? – Beachwalker
@Beachwalker Я заменил защищенное ключевое слово сигналами в своем ответе. Это наведет ваш вопрос. –