winqtdeploy后运行程序报错QQmlApplicationEngine failed to load component

为了将 Qt 程序打包成一个 EXE 文件,找到 Qt 6.6.2 (MSVC 2019 64-bit)(对于 MinGW 同理)并打开,在其命令行中输入

cd E:\Documents\GitHub\build-<YourApp>-Desktop_Qt_6_6_2_MSVC2019_64bit-Release
windeploy .

后,不管是在 Qt Creator 内运行 exe 文件还是直接打开 exe 文件都会报错:

QQmlApplicationEngine failed to load component
qrc:/qt/qml/com/github/<username>/main.qml:9:1: 类型 App 不可用
qrc:/qt/qml/content/App.qml: 模块“QtQuick.VirtualKeyboard.Components”没有安装
qrc:/qt/qml/content/App.qml: 模块“QtQuick.VirtualKeyboard.Layouts”没有安装
qrc:/qt/qml/content/App.qml: 模块“QtQuick.VirtualKeyboard.Components”没有安装
qrc:/qt/qml/content/App.qml: 模块“QtQuick.VirtualKeyboard.Layouts”没有安装
00:44:33: E:\Documents\GitHub\build-<YourApp>-Desktop_Qt_6_6_2_MSVC2019_64bit-Release\<YourApp>.exe 退出,退出代码: -1
{1 ?} {2?}

参考 QT failed to load components,对于 QML 程序,应运行

windeployqt --qmldir <location of qml folder> <location of exe>

对于本例,直接运行

windeployqt --qmldir qml YourApp.exe

即可。重新运行 exe 文件即可成功打开。

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
这个问题通常出现在使用 QML 作为用户界面的 Qt 应用程序中。这个错误表示 QQmlApplicationEngine 无法加载组件,可能是由于以下原因之一: 1. QML 文件中引用了不存在的元素或模块。请检查 QML 文件,确保它们引用的元素和模块都存在并正确导入。 2. 缺少必要的插件。如果您的应用程序使用了 Qt 的插件(例如 Qt Quick Controls、Qt Quick Dialogs 或 Qt Quick Widgets),则必须确保这些插件已正确加载。您可以在 main.cpp 文件中添加以下代码来加载插件: ``` #include <QGuiApplication> #include <QQmlApplicationEngine> #include <QtQml> int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app(argc, argv); QQmlApplicationEngine engine; engine.addImportPath("qrc:/"); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; // Load necessary plugins QQuickStyle::setStyle("Material"); qmlRegisterType<QMessageBox>("com.example", 1, 0, "MessageBox"); ... return app.exec(); } ``` 3. 某些组件无法找到其所需的上下文。在某些情况下,您需要将一个对象作为上下文传递给 QQmlApplicationEngine,以便 QML 文件中的组件可以访问它。例如,如果您在 QML 文件中使用了自定义 C++ 类型,则必须将该类型注册到 QML 引擎中,并将其实例作为上下文传递给 QQmlApplicationEngine。您可以在 main.cpp 文件中添加以下代码来注册和传递上下文: ``` #include <QGuiApplication> #include <QQmlApplicationEngine> #include <QtQml> class MyType : public QObject { Q_OBJECT public: ... }; int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app(argc, argv); // Register custom C++ type qmlRegisterType<MyType>("com.example", 1, 0, "MyType"); // Create instance of custom C++ type and pass it as context to QQmlApplicationEngine MyType myObject; QQmlApplicationEngine engine; engine.rootContext()->setContextProperty("myObject", &myObject); engine.addImportPath("qrc:/"); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; ... return app.exec(); } ``` 如果以上方法仍然无法解决问题,您可以尝试在终端中运行应用程序以查看更详细的错误信息。您还可以尝试在 QML 文件中添加一些调试信息,例如打印一些变量的值,以帮助您找到问题所在。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ayka

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值