Q_SCRIPT_DECLARE_QMETAOBJECT(FancyLineEdit, QWidget*);
template <typename T>
QScriptValue qobjectToScriptValue(QScriptEngine *engine, const T& value)
{
return engine->newQObject(value);
}
template <typename T>
void qobjectFromScriptValue(const QScriptValue& object, T& value)
{
value = static_cast<T>(object.toQObject());
}
template<typename T>
int qScriptRegisterMetaTypeEx(
QScriptEngine *eng,
const QScriptValue &prototype = QScriptValue())
{
return qScriptRegisterMetaType(eng, qobjectToScriptValue<T>, qobjectFromScriptValue<T>, prototype);
}
template<typename T>
QScriptValue qScriptCreateConstructor(QScriptEngine *engine
, const QScriptValue::PropertyFlags& flags = QScriptValue::KeepExistingFlags)
{
QScriptValue ctor = qScriptValueFromQMetaObject<T>(engine);
// for (int i = T::staticMetaObject.enumeratorOffset(); i < T::staticMetaObject.enumeratorCount(); ++i) {
// QMetaEnum metaEnum = T::staticMetaObject.enumerator(i);
// for (int g = 0; g < metaEnum.keyCount(); ++g)
// ctor.setProperty(metaEnum.key(g), metaEnum.value(g));
// }
engine->globalObject().setProperty(T::staticMetaObject.className(), ctor, flags);
return ctor;
}
Затем где-либо в коде инициализирующем приложение:
qScriptRegisterMetaTypeEx<FancyLineEdit*>(engine);
qScriptCreateConstructor<FancyLineEdit>(engine);
Вместо FancyLineEdit, свой виджет. Вышесказанное подходит только для qobject.