我想在两个 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/