通过索引而不是名称设置QObject的属性值

时间:2019-09-06 09:43:36

标签: qt qmetaobject

在我的发布者-订阅者类中,Qt组件通过其属性名称进行订阅。发布者将对<QObject*,PropertyName (as QString)>对映射到可发布变量的名称。

{ VarName -> [(QObject*, PropName)] }

在变量更改时,使用setProperty调用已订阅QObject的列表:

subscriber->setProperty( PropName.toAscii().constData(), NewValue );

我想优化从QString到char *的转换。我还假设,在setProperty内部,通过浏览const *和字符串比较的列表可以找到属性设置器函数。

QMetaObject提供以下方法:

int QMetaObject::indexOfProperty(const char *name) const

我可以在订阅期间使用它来获取索引,然后在值更改时仅使用Index而不是字符串名。

但是如何通过索引调用属性设置器?可能吗?

1 个答案:

答案 0 :(得分:1)

struct中,您将使用QMetaObject获得QMetaProperty,然后可以呼叫QMetaObject::property(QMetaObject::indexOfProperty(qPrintable(propName)))(或QMetaPropety::write(subscriber, value))。 (显然,您将存储索引而不是名称,该代码仅作为示例。)

和/或为了稍微提高效率,您可以使用writeOnGadget()存储属性名称,因为与QByteArray之间的转换要少一个步骤。