标签: qtscript

带有自定义类的QtScript instanceof会抛出与原型相关的错误

我有一个Qt项目,它使用QtScript模块使我的应用程序的某些组件可编写脚本.

在多次尝试使现有类直接在QtScript中可用之后,我选择使用继承QObject和QScriptable的包装类(主要是因为我有一些非qobject派生类,这些类是由其他人继承的,它们是否继承QObject,它是因此我不可能统一对待我所有的课程).

我现在正在尝试使用基于原型的继承.

我必须有类DrawableMeshDrawable相应的包装器Wrapper_DrawableWrapper_MeshDrawable.MeshDrawable继承DrawableWrapper_MeshDrawable继承Wrapper_Drawable.

我让脚本引擎(m_scriptEngine)都知道这两个类:

Wrapper_Drawable* wrapper_drawable = new Wrapper_Drawable();
QScriptValue wrapper_drawable_obj = m_scriptEngine->newQObject(wrapper_drawable);
m_scriptEngine->setDefaultPrototype(qMetaTypeId<Wrapper_Drawable*>(),
                                    wrapper_drawable_obj);

Wrapper_MeshDrawable* wrapper_meshDrawable = new Wrapper_MeshDrawable();
QScriptValue wrapper_meshDrawable_obj = m_scriptEngine->newQObject(wrapper_meshDrawable);
m_scriptEngine->setDefaultPrototype(qMetaTypeId<Wrapper_MeshDrawable*>(),
                                    wrapper_meshDrawable_obj);
Run Code Online (Sandbox Code Playgroud)

如果我没有弄错,那么doc说脚本引擎会将原型应用于Wrapper_Drawable类型的对象,Wrapper_MeshDrawable因为它们在C++中具有继承关系.

我有一个方法Wrapper_Drawable::drawables(),它返回一个Wrapper_Drawable(实际上是包含在其中的Drawable的子节点Wrapper_Drawable)的所有子节点.作为Drawable一个抽象类,所有孩子实际上都是MeshDrawables.

因为我希望用户"相信"他使用Drawables而不是Wrapper_Drawables,我已经声明:

m_scriptEngine->globalObject().setProperty("Drawable", wrapper_drawable_obj);
Run Code Online (Sandbox Code Playgroud)

上面声明了wrapper_drawable_obj.


我想测试引擎是否识别Wrapper_MeshDrawables,即使它们是在一个Wrapper_Drawables 数组中声明的.

curChildren = myDrawable.drawables()[0];
print(curChildren instanceof …
Run Code Online (Sandbox Code Playgroud)

c++ qt ecma262 qtscript

26
推荐指数
1
解决办法
1349
查看次数

与QtScript相比,Lua与Qt相比有多容易?

我刚刚开始使用Qt进行C++开发.但是,我也有兴趣使用Lua编写我的应用程序脚本,给出了各种文章,说明了编写应用程序的工作流程/ ui/glue的开发速度(简易性).但是,开箱即用Qt不支持它,而是包括QtScript.

我的问题基本上是我应该尝试使用Lua和Qt开发商业应用程序,还是坚持使用SDK中的QtScript?我猜主要是开发速度与稳定性问题.

c++ lua qt qtscript

10
推荐指数
1
解决办法
1万
查看次数

在qtScript上JavaScript的setTimeout相当于什么?

没什么可补充的; 在qtScript上JavaScript的setTimeout相当于什么?

javascript timer settimeout qtscript

10
推荐指数
1
解决办法
3990
查看次数

我可以在QtScript中使用should.js吗?

我正在使用QtScript自动化部分应用程序以进行开发和测试.我已经到了想要测试断言的地步,并基于"独立的断言库?" 我在Debian存储库中找到了什么,我选择了Should.js.

我无法将其加载到我的Qt应用程序中,因为它取决于Node的require()功能.我尝试实现这个版本,从"支持CommonJS的require()"开始,最后得到下面的代码.

可以让它工作,还是我注定了这种方法?我可能最好将should.js的位复制到一个文件中吗?我宁愿不让自己负责保持叉子更新.(许可是一个非问题,因为我不打算重新分发此代码).

这是我的MCVE; 对不起,我不能再短了!

should.cpp

#include <QCoreApplication>
#include <QDateTime>
#include <QDebug>
#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QScriptEngine>
#include <QScriptContext>
#include <QScriptContextInfo>
#include <QTextStream>


// Primitive implementation of Node.js require().
// N.B. Supports only .js sources.
QScriptValue require(QScriptContext* context, QScriptEngine* engine)
{
    const QString moduleName = context->argument(0).toString();

    // First, look in our modules cache
    QScriptValue modules = engine->globalObject().property("$MODULES");
    QScriptValue module = modules.property(moduleName);
    if (module.isValid()) {
        auto cached_file = module.property("filename");
        auto time_stamp = …
Run Code Online (Sandbox Code Playgroud)

c++ qt qtscript node.js should.js

8
推荐指数
1
解决办法
663
查看次数

在QtScript中完全创建GUI应用程序,您有何看法?

自从宣布QT许可证更改后,我开始考虑QT框架.它看起来不错,但我不喜欢使用C++.我知道各种语言都有不同的绑定,但QtScript对我来说似乎最有趣.

是否可以使用QtScript编写完整的GUI应用程序(当然,在UI设计者的帮助下),或者它仅用于编写现有应用程序的部分脚本.

user-interface qt qtscript

7
推荐指数
1
解决办法
4211
查看次数

如何配置QtScript代码?

我知道有一些工具可以分析纯粹的javascript代码,如firebugChrome的开发者工具,但我想知道是否有任何好的工具来分析QTScript.或者我如何使用这些工具来分析QtScript代码.

用例是因为有一个桌面应用程序,其大部分代码都是用JavaScript编写的,其中一些代码是用本机QT/C++编写的.在那种情况下,如果有人想要分析性能,有哪些工具可以自动进行分析.

javascript performance qt qtscript

6
推荐指数
1
解决办法
196
查看次数

仅在通过脚本访问时才定义属性

我遇到一些奇怪的行为,其中一个属性可以直接通过访问QObjectproperty功能,而不是通过JavaScript:

#include <QApplication>
#include <QDebug>
#include <QScriptEngine>
#include <QStringList>

class Item : public QObject
{
    Q_OBJECT
public:
    Q_PROPERTY(int typeId READ typeId)
    Q_PROPERTY(int usesLeft READ usesLeft)

    Item() :
        mTypeId(0),
        mUsesLeft(-1)
    {
    }

    Item(int typeId) :
        mTypeId(typeId)
    {
        if (typeId != 0) {
            mUsesLeft = 5;
        }
    }

    Item(const Item &item) :
        QObject(0)
    {
        *this = item;
    }

    ~Item()
    {
    }

    Item& operator=(const Item& rhs)
    {
        mTypeId = rhs.mTypeId;
        mUsesLeft = rhs.mUsesLeft;
        return *this;
    }

    int typeId() const …
Run Code Online (Sandbox Code Playgroud)

javascript qt properties qtscript qobject

6
推荐指数
1
解决办法
226
查看次数

有没有办法在QScriptEngine#pushContext/popContext之外维护Qt脚本上下文环境?

在Qt 4.8的脚本引擎,"局部"变量可通过设置获得QScriptContextQScriptEngine::pushContext再设置其激活对象的属性.这只能在推/弹调用中完成,因为这是唯一QScriptContext可用的地方,而AFAICT没有相当于QScriptEngine#evaluateQScriptContext用作环境:

QScriptEngine engine;
QScriptContext *local;

local = engine.pushContext();
local->activationObject().setProperty("value", 2); // set value=2
qDebug() << engine.evaluate("value").toNumber(); // outputs 2
engine.popContext();
Run Code Online (Sandbox Code Playgroud)

有没有办法维护一个环境,以便在推/弹调用之外使用评估?例如,我尝试创建一个QScriptValue用作激活对象,然后设置它:

QScriptEngine engine;
QScriptContext *local;

// Use ao as activation object, set variables here, prior to pushContext.
QScriptValue ao;
ao.setProperty("value", 1);

// Test with ao:
local = engine.pushContext();
local->setActivationObject(ao);
qDebug() << engine.evaluate("value").toNumber();
engine.popContext();
Run Code Online (Sandbox Code Playgroud)

但这不起作用.它输出nan代替1,作为value未定义.由于某种原因setActivationObject没有改变价值.

我的总目标是: …

c++ qt qt4 qtscript

6
推荐指数
1
解决办法
270
查看次数

Qt:Q_PROPERTY,带有QtScript访问的指针和前向声明

问题

我正在使用Q_OBJECT和Q_PROPERTY创建一个项目来从脚本访问一些对象.我有两个问题:

  1. 使用前向声明脚本的类
  2. 将属性作为指针返回

说明

1.为什么要前言?

B类将前向声明传递给A,因为A由于模板而需要标题中的完整B类型.B只需要标题中的不完整类型(A*),因此前向声明有效.

2.为什么要返回指针?

我们无法返回副本,因为我们需要访问脚本中的实际对象.我们不能返回引用,因为Qt不允许槽返回引用 - 它们的类型将被忽略,它们只返回void*.

完整的代码下载的引擎收录或ZIP文件或作为ZIP压缩文件小例子,可用于测试/播放:我需要拆分的文件向前声明和MOC.我添加了一个Makefile来测试它.制作deps:g ++,moc,Qt.

重要部分

class A; // forward declaration necessary, see explanation above

class B : public QObject {
    Q_OBJECT
    Q_PROPERTY(A a READ GetA) // <-- ERROR HERE
    // ...

public slots:
    A* GetA() { 
        return mA; 
    }

private:
    A* mA;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

脚本中的错误行:

print(bObj.GetA().GetName());
Run Code Online (Sandbox Code Playgroud)

编译错误

当我注释掉上面的Q_PROPERTY时,此错误消失.

tmp/B.moc.hpp:95:51: error: invalid use of incomplete type ‘struct A’
tmp/../B.hpp:10:7: error: forward declaration of …
Run Code Online (Sandbox Code Playgroud)

qt properties forward-declaration qtscript qobject

5
推荐指数
1
解决办法
3340
查看次数

QtScript vs QJSEngine什么时候使用?

我必须在C++应用程序中运行一系列javascript"脚本".其中大多数都是重复性的行为.这里的代码示例.

我知道Qt,因为版本5包含2个javascript引擎:QtScript和QJSEngine.

我的问题是我们应该使用哪种情况?哪种表现更好,在哪种情况下?

c++ qt qtscript qjsengine

5
推荐指数
1
解决办法
1694
查看次数