未找到 Qt Creator 导入文件
Posted
技术标签:
【中文标题】未找到 Qt Creator 导入文件【英文标题】:Qt Creator import file not found 【发布时间】:2016-04-20 20:21:50 【问题描述】:我正在尝试使用 Qt Creator 学习 Qt QML。我想将我的 javascript 函数放入一个单独的文件中并将其“导入”到 qml 世界中。已获得如下代码,用于测试其工作原理。
问题是我在 Creator 中运行项目时出现以下错误...
> Starting
> /home/dev/docs/projects/Qt/build-XmlModelView-Desktop-Debug/XmlModelView...
> QML debugging is enabled. Only use this in a safe environment.
> QQmlApplicationEngine failed to load component qrc:/main.qml:5 Script
> qrc:/MyFuncs.js unavailable qrc:/MyFuncs.js:-1 File not found
我看过视频,关注过 Qt 在线文档,也看过其他代码,但我看不出有什么问题。
我只能猜测某种路径设置不正确,但在文档中它说默认路径包括 QML 文件所在的目录。我的 .js 和 .qml 文件位于同一目录中。我也尝试编辑资源文件,但它完全崩溃了。
我尝试将 .js 文件移动到不同的位置,导入语句中的绝对路径。我的眼球现在开始掉出来了。
如果我使用 qmlscene 运行 main.qml,它确实可以工作
有人可以帮忙吗?这是我的代码...
main.qml 文件:
import QtQuick 2.3
import QtQuick.Window 2.2
import "MyFuncs.js" as MyFuncs
Window
id: window1
visible: true
Rectangle
id: contentArea
MouseArea
id: mouseArea1
anchors.fill: parent
onClicked:
MyFuncs.myfunc();
main.cpp 文件:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
int main(int argc, char *argv[])
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
MyFuncs.js 文件:
function myfunc()
console.log("function was called")
感谢您的帮助。迷路了一整天,不知道该往哪里走。
【问题讨论】:
只需将js文件添加到资源中即可。不用手动编辑,在项目浏览器中右键资源文件,选择add existing file
@ddriver 感谢您的帮助。我试过了。我尝试了很多次,但实际上并没有移动文件。但是,我又做了一次,但点击了“/”而不是“资源”。这次它添加了文件!!!它工作正常。
【参考方案1】:
注意: 您可能只需将 JavaScript 文件添加到资源中——然后当您的项目遇到复杂性,您不想为每个小更改重新编译时,您可以执行我在下面所做的操作:
您正在通过qrc:/MyFuncs.js
加载文件,这是资源的文件路径。问题是 JavaScript 文件(可能)没有被复制或不在您的路径上。 (这意味着您需要捆绑它)取决于您的场景路径,您可能会显示它。作为一个例子,我需要将我的 JavaScript 和 QML 复制到构建目录,这很烦人:
这是一个中等规模项目的配置文件示例:
CONFIG += c++11
# Add more folders to ship with the application, here
folder_qml.source = qml
folder_qml.target = /
folder_js.source = js
folder_js.target = /
folder_img.source = img
folder_img.target = /
folder_icon.source = icon
folder_icon.target = /
DEPLOYMENTFOLDERS += folder_qml folder_js folder_img folder_icon
请注意这里真正奇怪的语法:这会将js
、qml
、icon
和img
文件夹复制到构建中的/
,您会认为将这些文件转储到根目录中。再想想!构建目录如下所示:
+ debug
+ icon //I added this explicitly
+ img //I added this explicitly
+ js //I added this explicitly
+ qml //I added this explicitly
+ release
Makefile
Makefile.Debug
Makefile.Release
现在我的应用程序可以正确引用路径中存在的文件。在 IDE 中运行时(取决于设置),您可能拥有可用的文件,也可能没有。
这是我的main.qml
的片段:
import QtQuick 2.2
import QtQuick.LocalStorage 2.0
import QtQuick.Controls 1.0
import QtQuick.Layouts 1.1
import com.lightassistant 1.0
import "qrc:/js/lightassistant.js" as LA;
import "qrc:/js/statics.js" as Statics
在这里证明一点:
如果我将qrc:/js/statics.js
更改为qrc:/nope/js/statics.js
,则会出现错误:
` qrc:/nope/js/statics.js: File not found`
or
` qrc:/statics.js: File not found`
现在从 IDE 内部来看,事情应该没问题,因为它在源代码中运行可执行文件。上面列出的问题是关于部署的,有很多方法可以解决这个问题。我更喜欢这个,所以我可以运行批处理命令,你也可以使用[OS]qtdeploy
工具并指定一些路径来绕过它。
如果您正在测试 QML,这种技术可以防止每次有机会重新编译资源文件,这可能会在您的工作日增加 HOURS。复制文件速度很快,不需要捆绑资源文件。
我希望这会有所帮助,一年半前我也花了几天时间来弄清楚这一点。
【讨论】:
感谢您的帮助。你的回答有点超出我的想象,但它给了我一个开始的地方。所以你是说解决这个问题的最好方法是一种有助于解决未来复杂性/编译问题的方法。这种方法是通过在 CONFIG 文件中明确命名我的 .js 文件来“捆绑”它。谢谢。我将不得不阅读配置文件的内容。非常感谢您的快速回答(没有双关语)。 是的,我是说在路上明确复制 javascript/images/etc... 会加快速度。资源文件最终将需要大量时间来编译(我有一个 3-5 分钟的构建,这就是我转向这种方法的原因)。听起来你已经成功了。【参考方案2】:我仍然不确定为什么我的导入需要将文件放在“Resouces”中,我在 youtube 上看到的其他文件似乎没有这个也可以工作。但是,代码现在可以工作了,因为我已经通过右键单击将 .js 文件添加到资源中,而不是在资源上,而是在资源中的 / 文件夹上。为什么我以前没有尝试过。 感谢两位的帮助。
【讨论】:
您的文件现在可以正常工作,因为该资源现在通过Resources
文件在路径上可用。请注意,处理资源文件需要时间,如果它成为负担,您可能想回顾一下我的回答,对于一个小项目,编译时间可以忽略不计。以上是关于未找到 Qt Creator 导入文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Qt Creator 中解决“找不到 QML 模块”