我正在将QScript添加到我的Qt应用程序中。这很好用--我可以导航对象的层次结构并打印值(包括枚举)。
我有我的课..。
class HalPin : public QObject
{
Q_OBJECT
public:
enum EHalPinType
{
Bit = HAL_BIT,
Float = HAL_FLOAT,
S32 = HAL_S32,
U32 = HAL_U32
};
enum EHalPinDirection
{
In = HAL_IN,
Out = HAL_OUT,
IO = HAL_IO
};
Q_ENUMS(EHalPinType)
Q_ENUMS(EHalPinDirection)
public:
explicit HalPin(QObject *parent = 0);
signals:
public slots:
};
Q_DECLARE_METATYPE(HalPin::EHalPinType)
Q_DECLARE_METATYPE(HalPin::EHalPinDirection)
Q_DECLARE_METATYPE(HalPin*)我还有另一个类,它有一个以枚举为参数的方法……
class EmcHal : public QObject
{
Q_OBJECT
public:
explicit EmcHal(QString moduleName, QObject *parent = 0);
signals:
public slots:
QObject *createHalPin( HalPin::EHalPinType, HalPin::EHalPinDirection, QString name );
};这个类暴露在另一个类中--对不起,我应该简化这个例子。如果我编写下面的jscript代码,
var nextPagePin1 = Emc.hal.createHalPin();我得到了一个错误,我预期...
SyntaxError: too few arguments in call to createHalPin(); candidates are createHalPin(HalPin::EHalPinType,HalPin::EHalPinDirection,QString)我试过很多组合。
Bit
EHalPinType.Bit
HalPin.EHalPinType.Bit还有更多。
如果我尝试使用整数,我会得到...
TypeError: cannot call createHalPin(): argument 1 has unknown type `HalPin::EHalPinType' (register the type with qScriptRegisterMetaType())有什么建议吗?
或者我的语法对于jscript来说是错误的?
有没有人有一个实用的例子?
谢谢,弗兰克
发布于 2012-02-06 17:48:46
回答我自己的问题..。
好吧,这不是为什么的答案,而是一个"meh,this works“的例子……
如上所述,我无法使用qt宏同时在元数据和jscript中使用枚举。即使枚举出现在qscript中(我在脚本调试器的浏览器中进行了检查),它的计算结果也不是正确的整数。
我必须为枚举添加一个QMetaObject。这给了我枚举项和正确的整数值。
但是这仍然给了我未知的类型错误,所以我需要使用qScriptRegisterMetaType()来注册类型的转换函数。
这是我用于1枚举的类。这是我所能做到的最小限度的。我应该能够使用宏来进一步缩小它,但由于qt moc的要求,可以宏化的内容有一些限制。
#include <QObject>
#include <QMetaType>
#include <QScriptEngine>
#include "hal.h"
class CEHalPinType : public QObject
{
Q_OBJECT
public:
explicit CEHalPinType(QObject *parent = 0) : QObject(parent) {}
explicit CEHalPinType(const CEHalPinType &other) : QObject(other.parent()) {}
virtual ~CEHalPinType() {}
enum EHalPinType
{
Bit = HAL_BIT,
Float = HAL_FLOAT,
S32 = HAL_S32,
U32 = HAL_U32
};
Q_ENUMS( EHalPinType )
private:
static QScriptValue toScriptValue(QScriptEngine *engine, const EHalPinType &s)
{
return engine->newVariant((int)s);
}
static void fromScriptValue(const QScriptValue &obj, EHalPinType &s)
{
s = (EHalPinType)obj.toInt32();
}
static QScriptValue qscriptConstructor( QScriptContext *context, QScriptEngine *engine )
{
return engine->newQObject( new CEHalPinType(context->argument(0).toQObject()), QScriptEngine::ScriptOwnership);
}
public:
static void Init( const char *name, QScriptEngine *engine )
{
qScriptRegisterMetaType(engine, toScriptValue, fromScriptValue);
QScriptValue metaObject = engine->newQMetaObject( &staticMetaObject, engine->newFunction(qscriptConstructor) );
engine->globalObject().setProperty( name, metaObject );
}
};
Q_DECLARE_METATYPE(CEHalPinType::EHalPinType)我的jscript看起来像..。
var nextPagePin = Emc.hal.createHalPin(EHalPinType.Bit,EHalPinDirection.In,"nexis.NextPage");发布于 2012-02-09 18:46:20
糟了。我在这件事上抢先了一步。尽管脚本工作正常,我还是打破了使用qmetaobject数据将枚举转换为字符串的能力。
而且似乎没有一种自动的方法来做到这一点。
问题是,我将枚举移出了定义了使用枚举的属性的类。尽管Q_ENUMS和Q_PROPERTY可以编译,但是如果我使用QMetaProperty来读取枚举,它就不能工作。返回的QVariant显示了正确的数据类型"CEHalPinType::EHalPinType",但是它没有通过isEnum()测试,canConvert(QVariant::String)也失败了。这是因为当qmetaobject代码搜索枚举类型时,它只在当前类及其派生类中查找。它不搜索其他类。这就是为什么当枚举是也具有这些属性的类的成员时,它会起作用。
我的工作是创建我自己的已知枚举的QMap,存储字符串名称到qmetaobject的映射。我使用了一个模板化的基类,并使用T::staticMetaObject来获取元对象。
https://stackoverflow.com/questions/9137679
复制相似问题