首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QtScript +枚举

QtScript +枚举
EN

Stack Overflow用户
提问于 2012-02-04 09:35:16
回答 2查看 2K关注 0票数 2

我正在将QScript添加到我的Qt应用程序中。这很好用--我可以导航对象的层次结构并打印值(包括枚举)。

我有我的课..。

代码语言:javascript
复制
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*)

我还有另一个类,它有一个以枚举为参数的方法……

代码语言:javascript
复制
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代码,

代码语言:javascript
复制
var nextPagePin1 = Emc.hal.createHalPin();

我得到了一个错误,我预期...

代码语言:javascript
复制
SyntaxError: too few arguments in call to createHalPin(); candidates are createHalPin(HalPin::EHalPinType,HalPin::EHalPinDirection,QString)

我试过很多组合。

代码语言:javascript
复制
Bit
EHalPinType.Bit
HalPin.EHalPinType.Bit

还有更多。

如果我尝试使用整数,我会得到...

代码语言:javascript
复制
TypeError: cannot call createHalPin(): argument 1 has unknown type `HalPin::EHalPinType' (register the type with qScriptRegisterMetaType())

有什么建议吗?

或者我的语法对于jscript来说是错误的?

有没有人有一个实用的例子?

谢谢,弗兰克

EN

回答 2

Stack Overflow用户

发布于 2012-02-06 17:48:46

回答我自己的问题..。

好吧,这不是为什么的答案,而是一个"meh,this works“的例子……

如上所述,我无法使用qt宏同时在元数据和jscript中使用枚举。即使枚举出现在qscript中(我在脚本调试器的浏览器中进行了检查),它的计算结果也不是正确的整数。

我必须为枚举添加一个QMetaObject。这给了我枚举项和正确的整数值。

但是这仍然给了我未知的类型错误,所以我需要使用qScriptRegisterMetaType()来注册类型的转换函数。

这是我用于1枚举的类。这是我所能做到的最小限度的。我应该能够使用宏来进一步缩小它,但由于qt moc的要求,可以宏化的内容有一些限制。

代码语言:javascript
复制
#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看起来像..。

代码语言:javascript
复制
var nextPagePin = Emc.hal.createHalPin(EHalPinType.Bit,EHalPinDirection.In,"nexis.NextPage");
票数 2
EN

Stack Overflow用户

发布于 2012-02-09 18:46:20

糟了。我在这件事上抢先了一步。尽管脚本工作正常,我还是打破了使用qmetaobject数据将枚举转换为字符串的能力。

而且似乎没有一种自动的方法来做到这一点。

问题是,我将枚举移出了定义了使用枚举的属性的类。尽管Q_ENUMS和Q_PROPERTY可以编译,但是如果我使用QMetaProperty来读取枚举,它就不能工作。返回的QVariant显示了正确的数据类型"CEHalPinType::EHalPinType",但是它没有通过isEnum()测试,canConvert(QVariant::String)也失败了。这是因为当qmetaobject代码搜索枚举类型时,它只在当前类及其派生类中查找。它不搜索其他类。这就是为什么当枚举是也具有这些属性的类的成员时,它会起作用。

我的工作是创建我自己的已知枚举的QMap,存储字符串名称到qmetaobject的映射。我使用了一个模板化的基类,并使用T::staticMetaObject来获取元对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9137679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档