我有一个Qt项目,它使用QtScript模块使我的应用程序的某些组件可编写脚本.
在多次尝试使现有类直接在QtScript中可用之后,我选择使用继承QObject和QScriptable的包装类(主要是因为我有一些非qobject派生类,这些类是由其他人继承的,它们是否继承QObject,它是因此我不可能统一对待我所有的课程).
我现在正在尝试使用基于原型的继承.
我必须有类Drawable和MeshDrawable相应的包装器Wrapper_Drawable和Wrapper_MeshDrawable.MeshDrawable继承Drawable和Wrapper_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) 我刚刚开始使用Qt进行C++开发.但是,我也有兴趣使用Lua编写我的应用程序脚本,给出了各种文章,说明了编写应用程序的工作流程/ ui/glue的开发速度(简易性).但是,开箱即用Qt不支持它,而是包括QtScript.
我的问题基本上是我应该尝试使用Lua和Qt开发商业应用程序,还是坚持使用SDK中的QtScript?我猜主要是开发速度与稳定性问题.
没什么可补充的; 在qtScript上JavaScript的setTimeout相当于什么?
我正在使用QtScript自动化部分应用程序以进行开发和测试.我已经到了想要测试断言的地步,并基于"独立的断言库?" 我在Debian存储库中找到了什么,我选择了Should.js.
我无法将其加载到我的Qt应用程序中,因为它取决于Node的require()功能.我尝试实现这个版本,从"支持CommonJS的require()"开始,最后得到下面的代码.
可以让它工作,还是我注定了这种方法?我可能最好将should.js的位复制到一个文件中吗?我宁愿不让自己负责保持叉子更新.(许可是一个非问题,因为我不打算重新分发此代码).
这是我的MCVE; 对不起,我不能再短了!
#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) 自从宣布QT许可证更改后,我开始考虑QT框架.它看起来不错,但我不喜欢使用C++.我知道各种语言都有不同的绑定,但QtScript对我来说似乎最有趣.
是否可以使用QtScript编写完整的GUI应用程序(当然,在UI设计者的帮助下),或者它仅用于编写现有应用程序的部分脚本.
我知道有一些工具可以分析纯粹的javascript代码,如firebug和Chrome的开发者工具,但我想知道是否有任何好的工具来分析QTScript.或者我如何使用这些工具来分析QtScript代码.
用例是因为有一个桌面应用程序,其大部分代码都是用JavaScript编写的,其中一些代码是用本机QT/C++编写的.在那种情况下,如果有人想要分析性能,有哪些工具可以自动进行分析.
我遇到一些奇怪的行为,其中一个属性可以直接通过访问QObject的property功能,而不是通过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) 在Qt 4.8的脚本引擎,"局部"变量可通过设置获得QScriptContext从QScriptEngine::pushContext再设置其激活对象的属性.这只能在推/弹调用中完成,因为这是唯一QScriptContext可用的地方,而AFAICT没有相当于QScriptEngine#evaluate它QScriptContext用作环境:
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没有改变价值.
我的总目标是: …
我正在使用Q_OBJECT和Q_PROPERTY创建一个项目来从脚本访问一些对象.我有两个问题:
B类将前向声明传递给A,因为A由于模板而需要标题中的完整B类型.B只需要标题中的不完整类型(A*),因此前向声明有效.
我们无法返回副本,因为我们需要访问脚本中的实际对象.我们不能返回引用,因为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) 我必须在C++应用程序中运行一系列javascript"脚本".其中大多数都是重复性的行为.这里的代码示例.
我知道Qt,因为版本5包含2个javascript引擎:QtScript和QJSEngine.
我的问题是我们应该使用哪种情况?哪种表现更好,在哪种情况下?
qtscript ×10
qt ×9
c++ ×5
javascript ×3
properties ×2
qobject ×2
ecma262 ×1
lua ×1
node.js ×1
performance ×1
qjsengine ×1
qt4 ×1
settimeout ×1
should.js ×1
timer ×1