QtScript 反射/内省?
QtScript是否支持自省/反射功能(比如像Python的dir()那样),让我可以在运行时通过探索对象模型来“绘制”一个API的结构?
2 个回答
1
你真的应该多了解一下QObject和QMetaObject。
QScriptValue支持ECMA-262标准中定义的类型:基本类型,包括未定义(Undefined)、空(Null)、布尔值(Boolean)、数字(Number)和字符串(String);还有对象类型。此外,Qt脚本还内置支持QVariant、QObject和QMetaObject。
从Qt的QMetaObject页面来看:
Qt的元对象系统提供了信号和槽机制,用于对象之间的通信、运行时类型信息以及动态属性系统。
QObject包含一个方法children
,它可以返回这个对象的子对象列表,还有一个parent
方法。
从pyqt的角度来看,这些都是Python对象,我简单测试过,inspect模块在它们上面工作得很好。
你应该能用这些中的任何一个来构建一个。
顺便说一下,据我所知,PyQt和Qt是一样的,提供相同的信息。最终如果在C++的Qt中能工作,那么在PyQt中也应该能工作。
1
是的。你没有说明是想在QtScript中做这件事,还是在C++中做。
在脚本引擎里,你可以用标准的ECMAScript方法来遍历一个对象上的所有属性:
for (var property_name in some_object) {
// do something with each property
}
这包括例如导入到脚本引擎中的QObject上的任何槽、信号和Q_PROPERTY
。不过,它不会包括那些没有标记为信号、槽或Q_INVOKABLE
的C++方法。
在C++中,你可以使用QScriptValueIterator来遍历脚本引擎中任何对象的所有属性。