c++ - 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 不支持信号和槽的模板;因此,这不起作用。
那么,我还能如何实现呢?我有一个控制器需要向其他线程中的多个相同设备中的特定设备发出信号。理想情况下,我希望这样做而不添加更多信号(稍后更新更复杂)、过滤槽端(低效)或在中间添加另一个类。
解决方案
您可以使用 QMetaObject::invokeMethod 直接调用对象的插槽,而不是连接的信号发射。像这样:
QMetaObject::invokeMethod(doohickeys[0], "updateState", Qt::QueuedConnection, Q_ARG(dooHickeyState, doohickeyState));
QMetaObject::invokeMethod(doohickeys[1], "updateState", Qt::QueuedConnection, Q_ARG(dooHickeyState, anotherDoohickeyState));
推荐阅读
- azure-functions - 如何从另一个 azure 资源组中的资源获取输入绑定?
- javascript - 排序字符串数组,但数字最后
- ntlm - 如何为 NTLM 身份验证生成 type3 消息?
- python - 如何捕获“NoneType”对象在综合列表中没有“get”属性
- r - 数据表几列的散点图
- javascript - 如何在递归函数后初始化全局数组
- algolia - Algolia 的高级语法高亮问题与单引号字符
- sqlite - 如何每天使用不同的?
- c# - 如何在 C# 中以编程方式订阅 TFS 的 VersionControlServer 事件?
- android - 如何处理 BluetoothGattCallback 覆盖方法 onCharacteristicChanged() 通知