按索引而不是名称设置 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 *
。
在我的发布-订阅者 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 *
。