Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未安装Qt5 QML模块_Qt_Qml_Qt5 - Fatal编程技术网

未安装Qt5 QML模块

未安装Qt5 QML模块,qt,qml,qt5,Qt,Qml,Qt5,我对Qt-QML中的模块感到困惑。我已经读了所有的文件,但它没有阐明一些基本的想法 我知道我可以将一组QML文件放入一个目录中,并添加一个qmldir文件来描述已识别的模块。当我这样做并调整QML_IMPORT_路径时,QtCreator很高兴并停止在IMPORT ModuleName 1.0行下划线 所以造物主是快乐的,但它不工作。我得到模块未安装。 我的问题是: “已安装”是什么意思。我有文件目录,但我还没有“安装”到任何地方 我应该构建/编译模块以生成DLL/吗 模块QML文件是否进入主

我对Qt-QML中的模块感到困惑。我已经读了所有的文件,但它没有阐明一些基本的想法

我知道我可以将一组QML文件放入一个目录中,并添加一个qmldir文件来描述已识别的模块。当我这样做并调整QML_IMPORT_路径时,QtCreator很高兴并停止在IMPORT ModuleName 1.0行下划线

所以造物主是快乐的,但它不工作。我得到模块未安装。 我的问题是:

  • “已安装”是什么意思。我有文件目录,但我还没有“安装”到任何地方
  • 我应该构建/编译模块以生成DLL/吗
  • 模块QML文件是否进入主应用程序的资源中,否则在哪里可以找到它们
  • my main.qml文件是应用程序资源的一部分,应用程序在运行时如何定位模块的资源
抱歉,对于所有这些问题,这些模块的基础知识并不清楚。我不明白“模块”是文件共享还是编译单元


谢谢您的帮助。

我将尝试回答您的问题:

  • 我认为安装意味着它们位于正确的路径中,因此
    可以在运行时找到它们
  • 您不必为此目的创建/构建
    QmlExtensionPlugin
    。您还可以将普通QML文件作为一个模块使用 带有描述此模块的
    qmldir
    的目录。这是个问题 分发你的代码。使用
    QmlExtensionPlugin
    可以提供 模块已编译,如果要隐藏代码
  • 这些模块可以在资源系统中,也可以作为磁盘上的文件,这取决于您
  • 应用程序在预定义路径中查找模块-在应用程序的目录中,在Qt插件路径中,在
    QML2\u导入路径中,在您使用
    engine->addImportPath()添加的目录中
有很多事情会导致模块无法加载。您可以检查以下内容:

  • qmldir
    中的模块标识符应与目录相同 名称,模块实际驻留的位置。例如,如果您的模块 具有模块标识符
    模块测试。在
    qmldir
    中,模块的 相对路径必须是
    测试/模块
  • 如果它是QML扩展 插件(共享库),确保插件的目录名为 与插件的名称相同
  • export
    QML2\u IMPORT\u PATH
    (确保名称中有
    2
    )env变量指向包含模块的目录。还有一个
    QQmlEngine::addImportPath
    方法,它将目录添加到列表中以查找插件
  • 如果它是一个qml扩展插件(共享库),那么它可能缺少依赖项。您可以通过在Windows上或Linux上的
    ldd
    命令来检查它
  • 设置
    QT\u PLUGIN\u PATH
    运行时变量可能有助于加载插件。它应该指向包含插件目录的目录,而不是插件目录本身
  • 您还可以启用跟踪,以查看加载插件时发生的情况,以便更好地了解问题-导出
    QT\u DEBUG\u plugins=1
    QML\u IMPORT\u TRACE=1
    环境变量
  • 您也可以阅读此链接:

    在我的例子中(我在qrc资源中有所有QML文件),我还将qmldir添加到资源中,并调用QQmlApplicationEngine的方法addImportPath(“qrc:/”)

    My main.cpp看起来像:

    QQmlApplicationEngine engine;
    engine.addImportPath("qrc:/");
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    
    RESOURCES += qml.qrc \
        MyModule/mymodule.qrc
    
    QML_IMPORT_PATH += $$PWD
    
    my.pro文件的重要部分如下所示:

    QQmlApplicationEngine engine;
    engine.addImportPath("qrc:/");
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    
    RESOURCES += qml.qrc \
        MyModule/mymodule.qrc
    
    QML_IMPORT_PATH += $$PWD
    
    我的qmldir:

    module MyModule
    
    MyItem          2.0 MyItem20.qml
    MyItem          2.1 MyItem21.qml
    
    我的qrc:

    <RCC>
        <qresource prefix="/MyModule">
            <file>MyItem20.qml</file>
            <file>MyItem21.qml</file>
            <file>qmldir</file>
        </qresource>
    </RCC>
    
    QtCreator很高兴(不在组件和导入下划线),模块已加载。
    希望这能有所帮助。

    我也有同样的问题,现在已经解决了。我找到了一个iOS的QML插件。有几件事需要注意:

    1。plugin pro文件需要添加一个内容:

    classname IosqmlpluginPlugin
    # for ERROR: Plugin iostestqmlplugin is missing a classname entry,
    # please add one to the qmldir file.
    # look for qt document http://doc.qt.io/qt-5.6/qtqml-modules-qmldir.html
    
    ios {
        IOSTestPlugin_BUNDLE.files += $$files($$[QT_INSTALL_QML]/IosTestPulgin/qmldir)
        IOSTestPlugin_BUNDLE.path =  IosTestPulgin
        QMAKE_BUNDLE_DATA += IOSTestPlugin_BUNDLE
    }
    # for ios error: module is not installed
    # this means external qml static plugin must add the plugin dir by manual
    # in the app root dir
    
    uri=IosTestPulgin

    2。QML插件qmldir文件需要这样的附加行:

    classname IosqmlpluginPlugin
    # for ERROR: Plugin iostestqmlplugin is missing a classname entry,
    # please add one to the qmldir file.
    # look for qt document http://doc.qt.io/qt-5.6/qtqml-modules-qmldir.html
    
    ios {
        IOSTestPlugin_BUNDLE.files += $$files($$[QT_INSTALL_QML]/IosTestPulgin/qmldir)
        IOSTestPlugin_BUNDLE.path =  IosTestPulgin
        QMAKE_BUNDLE_DATA += IOSTestPlugin_BUNDLE
    }
    # for ios error: module is not installed
    # this means external qml static plugin must add the plugin dir by manual
    # in the app root dir
    
    3客户端项目pro文件需要添加如下内容:

    classname IosqmlpluginPlugin
    # for ERROR: Plugin iostestqmlplugin is missing a classname entry,
    # please add one to the qmldir file.
    # look for qt document http://doc.qt.io/qt-5.6/qtqml-modules-qmldir.html
    
    ios {
        IOSTestPlugin_BUNDLE.files += $$files($$[QT_INSTALL_QML]/IosTestPulgin/qmldir)
        IOSTestPlugin_BUNDLE.path =  IosTestPulgin
        QMAKE_BUNDLE_DATA += IOSTestPlugin_BUNDLE
    }
    # for ios error: module is not installed
    # this means external qml static plugin must add the plugin dir by manual
    # in the app root dir
    
    我想进一步阐述——我认为这是集成模块的最佳技术——但无法在评论中表达这些想法,所以这里有一个新的答案

    重要的是首先要了解qml模块及其关联资源是运行时实体,并且假设它们分别存在于相对于可执行文件的某个位置,除非它们包含在应用程序资源中。通过将它们包含在资源中,它们仍然是运行时实体,但它们存在于应用程序二进制文件中的qrc:/root路径下。模块的这种隐藏是我认为这是最好的技术的主要原因,除非您希望您的模块在部署后可以进行修订,或者可以作为预编译插件独立部署(即,在动态链接库的资源存储中)

    以下是我对以下重要因素的解释:

  • engine.addImportPath(“qrc:/”)
    RESOURCES+=MyModule/MyModule.qrc
    需要在项目(.pro)文件中添加模块的文件到
  • 项目文件中的
    QML\u IMPORT\u PATH+=$$PWD
    告诉Qt Creator从项目源代码树的根开始查找模块。在我的例子中,我必须将其设置为一个子目录(例如,“ui/modules”),因为我的模块目录从那里开始。导入路径应包括所有模块目录下的根目录。据我所知,此指令仅适用于Qt Creator IDE,不会影响构建-这就是为什么需要#1的原因
  • qmldir文件的内容是原样的,但是它包含在模块的.qrc资源文件中是不直观的,除非您考虑