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,但我並不知道。若有知道原因的大神,希望可以指出。