【问题标题】:How to invoke method by function pointer? [duplicate]如何通过函数指针调用方法? [复制]
【发布时间】:2017-06-14 01:42:31
【问题描述】:

调用方法

正常方式:

QMetaObject::invokeMethod(obj, "function");

但不是使用字符串。这就是我想要的:

QMetaObject::invokeMethod(obj, function());
// or any macro like SLOT
QMetaObject::invokeMethod(obj, FUNC_NAME(function()));

【问题讨论】:

  • 为什么使用QMetaObject::invokeMethod而不是直接通过obj.func()调用方法?
  • @putu 例如,调用不同线程中的方法。
  • 具体来说,在this answer 中查找“TL;DR for methods/slots”

标签: qt


【解决方案1】:

强烈建议您使用常规方式,即使用QMetaObject::invokeMethod(obj, "function")。但是,如果您愿意,可以使用以下 stringify 宏:

#define FUNC_NAME(a)         (QString(#a).remove(QRegExp("\\((.*)\\)")).trimmed().toLatin1().constData())

//usage
QMetaObject::invokeMethod(obj, FUNC_NAME(function()));

上述宏将参数转换为字符串,然后删除(...) 之间的方法/函数参数。

【讨论】:

  • stringify 宏不提供针对函数签名更改的编译时保护,这与 Qt 5.10 函数指针语法重载不同,后者会在函数名不存在时导致编译器错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 2012-08-24
相关资源
最近更新 更多