c++ - 在 Qt 中的对象之间发送自定义事件而不关联它们

标签 c++ qt event-handling qevent

我想在两个 Qt 对象之间发送一些自定义事件,但不在它们之间建立关系。通常在 Qt 中我们可以发送自定义事件(QApplication::sendEvent),但我们必须指定一个指向接收者对象的指针!但是,当这两个对象处于不同的范围(即某个小部件,接收器是某个管理数据库的对象)时,共享指向接收器的指针可能会出现问题。

我创建了一个事件调度程序对象来处理自定义事件。它的操作非常简单 - 一方面,Qt 对象可以将自定义事件发送到调度程序(调度程序是接收者),第二个对象(接收者)订阅以接收该自定义事件。两个对象彼此不了解,但调度程序必须在代码中的任何位置全局可用(这不是一个大问题)。 简化代码示例:

EventDispatcher.h

class EventDispatcher : public QObject
{
public:
    EventDispatcher() = default;
    bool event(QEvent* e) override;

    void registerObj(QObject* obj)
    {
        subscribers.push_back(obj);
    }

private:
    std::vector<QObject*> subscribers;
};

EventDispatcher.cpp

bool EventDispatcher::event(QEvent *e)
{
    if(e->type() == QCustomEvent::type())
    {
        //getValue is a specific method of QCustomEvent
        qDebug() << "custom event received. Value: " << ((QCustomEvent*)e)->getValue();
        for(auto* s : subscribers)
            QApplication::sendEvent(s, e);
        return true;
    }
    return QObject::event(e);
}

用法 - 发送事件:

//QCustomEvent inherits from the QEvent
QCoreApplication::sendEvent(g_eventDispatcherInstance, new QCustomEvent());

使用 - 注册:

g_evd->registerObj(ui->widget_4);

//we can receive and handle that custom event in widget_4 class in bool event(QEvent* ev) override; method

但是我相信它可以更简单地完成,无需创建中间调度程序类,仅使用 Qt 类,并且无需耦合它们 - sander 和接收器。 嗯,但是看看这个问题: Post events without specifying target object in Qt ,看起来并不是那么简单,制作某种调度程序是不可避免的:-|

最佳答案

一个对象向 qApp 对象(或 QCoreApplication::instance())发送自定义事件怎么样?另一个对象可以在qApp对象上安装事件过滤器,并在拦截到自定义事件后对其进行处理。这两个对象(事件发送者和事件处理器)不需要彼此了解。如果事件过滤器未处理,qApp 将忽略自定义事件。您所需要的只是为处理器对象实现事件过滤器。这很简单。

关于c++ - 在 Qt 中的对象之间发送自定义事件而不关联它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75810707/

相关文章:

c# - 是否可以在 c# 中使用 "chain"EventHandlers?

c++ - Qt QMetaData类名实现

c++ - 不需要有 VAO?

c++ - 将内存数据 ptr 映射到 qt 输入字段

android - 尝试使用 Qt Creator 编译我的应用程序

javascript - jQuery:分配多个事件处理程序是非法的还是不好的做法?

c# - 在 .Net 中设置/删除事件处理程序

c++ - gtest 和 gmock 有什么区别?

c++按字母顺序对名称进行排序

c++ - 将 Visual Studio 项目导出到 Qt 项目