未找到 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

请注意这里真正奇怪的语法:这会将jsqmliconimg 文件夹复制到构建中的/,您会认为将这些文件转储到根目录中。再想想!构建目录如下所示:

 + 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 导入文件的主要内容,如果未能解决你的问题,请参考以下文章

为啥 CMake 在 Qt Creator 中过早结束?

如何在 Qt Creator 中解决“找不到 QML 模块”

使用导入的 makefile 将 Qt Creator .config 添加到 .h

在 QT-creator 中找不到 phoneGap 文件

qt creator源码全方面分析(4-2)

qt creator源码全方面分析(4-2)