Skip to content

ElaEventBus 组件文档 ​

概述 ​

ElaEventBus 是一个轻量级的事件总线组件,用于实现组件间的解耦通信。它支持事件的注册、发布和订阅,并提供了自动连接类型和参数传递功能。

主要组件 ​

ElaEventBus ​

事件总线管理器,负责事件的分发和管理。

ElaEvent ​

事件对象,用于定义和注册具体的事件。

特性 ​

  • 单例模式
  • 支持多订阅者
  • 自动连接类型
  • 参数传递
  • 事件名管理
  • 自动注销
  • 线程安全
  • 类型安全

公共方法 ​

ElaEventBus ​

cpp
// 发布事件
ElaEventBusType::EventBusReturnType post(
    const QString& eventName, 
    const QVariantMap& data = {});

// 获取已注册的事件名列表
QStringList getRegisteredEventsName() const;

ElaEvent ​

cpp
// 构造函数
explicit ElaEvent(
    QString eventName,
    QString functionName,
    QObject* parent = nullptr);

// 注册并初始化事件
ElaEventBusType::EventBusReturnType registerAndInit();

// 属性设置
void setEventName(const QString& eventName);
void setFunctionName(const QString& functionName);
void setConnectionType(Qt::ConnectionType connectionType);

使用示例 ​

基础用法 ​

1. 注册事件 ​

cpp
class MyWidget : public QWidget {
    Q_OBJECT
public:
    MyWidget(QWidget* parent = nullptr) : QWidget(parent) {
        // 创建并注册事件
        ElaEvent* event = new ElaEvent(
            "updateUI",           // 事件名
            "onUpdateUI",         // 处理函数名
            this                  // 父对象
        );
        event->registerAndInit();
    }
    
public slots:
    // 事件处理函数
    void onUpdateUI(QVariantMap data) {
        QString message = data["message"].toString();
        qDebug() << "Received update:" << message;
    }
};

2. 发布事件 ​

cpp
// 获取事件总线实例
ElaEventBus* eventBus = ElaEventBus::getInstance();

// 发布事件
QVariantMap data;
data["message"] = "UI needs update";
data["timestamp"] = QDateTime::currentDateTime();

eventBus->post("updateUI", data);

高级用法 ​

1. 自定义连接类型 ​

cpp
// 创建事件对象
ElaEvent* event = new ElaEvent(this);
event->setEventName("asyncUpdate");
event->setFunctionName("onAsyncUpdate");
event->setConnectionType(Qt::QueuedConnection);
event->registerAndInit();

2. 多订阅者模式 ​

cpp
// 第一个订阅者
ElaEvent* event1 = new ElaEvent(
    "globalUpdate", 
    "onUpdate",
    subscriber1
);
event1->registerAndInit();

// 第二个订阅者
ElaEvent* event2 = new ElaEvent(
    "globalUpdate", 
    "onUpdate",
    subscriber2
);
event2->registerAndInit();

// 发布事件 - 两个订阅者都会收到
eventBus->post("globalUpdate", data);

3. 事件管理 ​

cpp
// 获取所有已注册的事件名
QStringList events = eventBus->getRegisteredEventsName();

// 打印事件列表
qDebug() << "Registered events:";
for(const QString& eventName : events) {
    qDebug() << " -" << eventName;
}

返回值类型 ​

ElaEventBusType::EventBusReturnType ​

cpp
enum class EventBusReturnType {
    Success,           // 操作成功
    EventInvalid,      // 事件无效
    EventNameInvalid   // 事件名无效
};

注意事项 ​

  1. 事件名不能为空
  2. 函数名必须是有效的槽函数
  3. 事件对象会自动注销
  4. 支持跨线程事件分发
  5. 参数通过 QVariantMap 传递
  6. 注意内存管理
  7. 避免循环依赖
  8. 建议使用有意义的事件名

最佳实践 ​

  1. 使用常量定义事件名
  2. 合理组织事件层级
  3. 及时清理不用的事件
  4. 避免过度使用
  5. 文档化事件接口
  6. 处理错误返回值
  7. 合理使用连接类型
  8. 注意参数类型安全

相关组件 ​

  • QObject: 基类支持
  • QVariant: 参数传递
  • QMetaObject: 元对象系统
  • Qt::ConnectionType: 连接类型