QJSEngine
QJsengine是代替QScriptEngine的新的js引擎。
release
release版本软件是区别于debug版本的。
问题
今天在resource文件中读取js文件,用QJsengine加载,代码如下。
.cpp文件
QJSEngine jsengine;
jsengine.installExtensions(QJSEngine::AllExtensions);
QString fileName = ":/test.js";
QFile scriptFile(fileName);
qDebug()<<QFileInfo(scriptFile).absoluteFilePath();
if (!scriptFile.open(QIODevice::ReadOnly)){
QMessageBox::information(nullptr, "Title", "文件打开失败",
QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
return ;
}
QTextStream stream(&scriptFile);
QString contents = stream.readAll();
scriptFile.close();
QJSValue result = jsengine.evaluate(contents, fileName);
if (result.isError())
qDebug()
<< "Uncaught exception at line"
<< result.property("lineNumber").toInt()
<< ":" << result.toString();
qDebug()<<"end";
.js文件
console.log("hello!");
debug版本运行正常,但切换到release后发现无法执行。
查找原因
打印读出的js文件内容
打印读出的js文件,发现没有,是空的。
QTextStream stream(&scriptFile);
QString contents = stream.readAll();
scriptFile.close();
qDebug()<<contents;
QJSValue result = jsengine.evaluate(contents, fileName);
什么,用了几百遍的代码,居然出错了,文件打开了,却没有读取出来?一万个为什么飘过。
查看资源文件内容
<RCC>
<qresource prefix="/">
<file>test.js</file>
</qresource>
</RCC>
删除user文件,重新构建
删除.pro.user文件,重新构建代码,debug正常,release版本还是不行。
比较两个的obj,moc等文件,发现了一些问题。
debug版本是这样的
moc_mainwindow.cpp
moc_mainwindow.o
moc_predefs.h
qrc_res.cpp
qrc_res.o
release版本是这样的
moc_mainwindow.cpp
moc_mainwindow.o
moc_predefs.h
qmlcache_loader.cpp
qmlcache_loader.o
test_js.cpp
test_js.o
test_js.cpp,这不是我的js文件吗?怎么成cpp了?好吧,暂时理解为编译器由于某种神奇的力量,将我的resource文件中的test.js文件编译了,变成了.cpp文件,而没有将它放在资源文件中,导致无法读取出数据。
重命名尝试
既然js文件被编译,那其他文件不会被编译吧?重命名test.js文件为test.jst,重新加载,软件正常。
总结
Qt release版resource 中js文件会被特殊编译为cpp文件,而不是资源文件的cpp文件,导致读取资源文件内容时,无法读取到数据,解决方法就是将js文件不要命名为.js,用其他后缀代替。
ps:此问题所用的qt版本为5.12.2,系统为windows7,经尝试,MinGW和msvc编译器都是如此。也许在什么地方将js优化为cpp,但我并不知道。若有知道原因的大神,希望可以指出。