首页 > 解决方案 > Qt:我应该如何动态地将信号路由到适当的对象?

问题描述

我正在用 Qt 编写一个应用程序。我正在尝试创建一个信号和插槽系统,以将单个控制器线程连接到代表真实设备的多个线程。设备的数量在编译时是已知的,但我希望尽可能容易地更改它们的数量。我最初的方法在信号上使用了模板,如下所示:

signals:
    template<int whichOne> void updateDoohickeyState(dooHickeyState newState);

我希望我可以像这样将这些连接到设备:

connect(doohickeyController, doohickeyController::updateDoohickeyState<0>,
        doohickeys[0], doohickeyObject::updateState,
        Qt::QueuedConnection);

connect(doohickeyController, doohickeyController::updateDoohickeyState<1>,
        doohickeys[1], doohickeyObject::updateState,
        Qt::QueuedConnection);
// Etc...

然后,当我想向设备发出信号时,我可以执行以下操作:

emit updateDoohickeyState<0>(doohickeyState);
emit updateDoohickeyState<1>(anotherDoohickeyState);

不幸的是,Qt 的 MOC 不支持信号和槽的模板;因此,这不起作用。

那么,我还能如何实现呢?我有一个控制器需要向其他线程中的多个相同设备中的特定设备发出信号。理想情况下,我希望这样做而不添加更多信号(稍后更新更复杂)、过滤槽端(低效)或在中间添加另一个类。

标签: c++qt

解决方案


您可以使用 QMetaObject::invokeMethod 直接调用对象的插槽,而不是连接的信号发射。像这样:

QMetaObject::invokeMethod(doohickeys[0], "updateState", Qt::QueuedConnection, Q_ARG(dooHickeyState, doohickeyState));
QMetaObject::invokeMethod(doohickeys[1], "updateState", Qt::QueuedConnection, Q_ARG(dooHickeyState, anotherDoohickeyState));

推荐阅读