qt - 如何使用 QMetaObject::activate 触发信号
问题描述
我发现了一篇关于如何使用动态属性实现 QObject 的有趣文章(参见 C++ 类 DynamicObject)。文章中的代码工作正常,DynamicObject 的属性是从 C++ 和 QML 成功获取和设置的,但我唯一不知道的是如何触发动态信号。
我尝试使用以下代码触发“nameChanged()”信号:
bool DynamicObject::emitDynamicSignal(char *signal, void **arguments)
{
QByteArray theSignal = QMetaObject::normalizedSignature(signal);
int signalId = metaObject()->indexOfSignal(theSignal);
if (signalId >= 0)
{
QMetaObject::activate(this, metaObject(), signalId, arguments);
return true;
}
return false;
}
myDynamicObject->emitDynamicSignal("nameChanged()", nullptr);
找到信号的索引并将signalId分配为5,但没有触发信号。但如果我这样做,例如,
myDynamicObject->setProperty("name", "Botanik");
属性被更改并且信号被成功触发。
我的代码有什么问题?我应该将什么作为 QMetaObject::activate 的“参数”参数传递?
编辑1:
完整的源代码暂时可在此处获得。
解决方案
信号也是一种方法。您可以从元对象调用它。
因此,将您的行替换QMetaObject::activate(...)
为:
metaObject()->method(signalId).invoke(this);
并让 Qt 处理对activate()
.
中还有一个问题DynamicObject::qt_metacall()
:您只处理QMetaObject::ReadProperty
和QMetaObject::WriteProperty
调用。
QMetaObject::InvokeMetaMethod
如果要发出信号,则必须添加。
推荐阅读
- android - Android Studio:使用 Mercado Pago 进行透明结帐
- python - Heroku 应用程序部署因 nodejs 和烧瓶而失败
- css - 如何将子项的高度填充到另一侧并排的高度;
- r - 读取多个数据帧并使用 R 中的循环进行重组
- r - 按因子水平和列识别 R 数据中的异常值
- python - 有没有更有效的方法来遍历字典列表?
- amazon-web-services - 如何在 aws 中创建 docker-machine?创建机器时出错:检测操作系统时出错:等待 SSH 可用的重试次数过多
- c++ - 每次用户几乎找到密码时都尝试生成不同的密码
- javascript - Puppeteer:超时或睡眠或在 Page.Evaluate() 内等待
- java - Mule CXF 模块缺少 UrlUtilities