Trong Qt, "tín hiệu" là synonim cho "được bảo vệ". Nhưng nó giúp MOC tạo ra mã cần thiết. Vì vậy, nếu bạn yêu cầu giao diện với một số tín hiệu - bạn nên khai báo chúng như là các phương thức trừu tượng được bảo vệ ảo. Tất cả mã cần thiết sẽ được tạo bởi MOC - bạn có thể thấy chi tiết, rằng "phát ra somesignal" sẽ được thay thế bằng cuộc gọi ảo của phương thức được bảo vệ có cùng tên. Lưu ý rằng phần thân của phương thức aslo được tạo bởi Qt.
CẬP NHẬT: Mã mẫu:
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();
}
Nguồn
2013-07-30 09:49:49
Bạn có thể chỉ viết 'signal: void someThingHappened();'. Nó không cần thiết Thực hiện tín hiệu. – Ruu
Tôi biết tín hiệu được tạo ra trong quá trình thực hiện nhưng làm cách nào mà người quan sát biết đây là tín hiệu (qt) nếu chỉ có giao diện được biết? – Beachwalker
@Beachwalker Tôi đã thay thế từ khóa được bảo vệ bằng các tín hiệu trong câu trả lời của mình. Nó sẽ di chuyển câu hỏi của bạn. –