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

Set property value of QObject by index, not name

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

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

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

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

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

QMetaObject 提供方法:

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

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

但是如何通过索引调用属性 setter?有可能吗?

QMetaObject 开始,您将使用 QMetaObject::property(QMetaObject::indexOfProperty(qPrintable(propName))) 获得 QMetaProperty,然后您可以调用 QMetaPropety::write(subscriber, value)(或 writeOnGadget())。 (显然你会存储索引而不是名称,该代码只是为了举例。)

And/or 为了稍微提高效率,您可以使用 QByteArray 来存储 属性 名称,因为这样可以减少一个转换步骤 to/from char *