未安装Qt5 QML模块
我对Qt-QML中的模块感到困惑。我已经读了所有的文件,但它没有阐明一些基本的想法 我知道我可以将一组QML文件放入一个目录中,并添加一个qmldir文件来描述已识别的模块。当我这样做并调整QML_IMPORT_路径时,QtCreator很高兴并停止在IMPORT ModuleName 1.0行下划线 所以造物主是快乐的,但它不工作。我得到模块未安装。 我的问题是:未安装Qt5 QML模块,qt,qml,qt5,Qt,Qml,Qt5,我对Qt-QML中的模块感到困惑。我已经读了所有的文件,但它没有阐明一些基本的想法 我知道我可以将一组QML文件放入一个目录中,并添加一个qmldir文件来描述已识别的模块。当我这样做并调整QML_IMPORT_路径时,QtCreator很高兴并停止在IMPORT ModuleName 1.0行下划线 所以造物主是快乐的,但它不工作。我得到模块未安装。 我的问题是: “已安装”是什么意思。我有文件目录,但我还没有“安装”到任何地方 我应该构建/编译模块以生成DLL/吗 模块QML文件是否进入主
- “已安装”是什么意思。我有文件目录,但我还没有“安装”到任何地方
- 我应该构建/编译模块以生成DLL/吗
- 模块QML文件是否进入主应用程序的资源中,否则在哪里可以找到它们
- my main.qml文件是应用程序资源的一部分,应用程序在运行时如何定位模块的资源
谢谢您的帮助。我将尝试回答您的问题:
- 我认为安装意味着它们位于正确的路径中,因此
可以在运行时找到它们 - 您不必为此目的创建/构建
。您还可以将普通QML文件作为一个模块使用 带有描述此模块的QmlExtensionPlugin
的目录。这是个问题 分发你的代码。使用qmldir
可以提供 模块已编译,如果要隐藏代码QmlExtensionPlugin
- 这些模块可以在资源系统中,也可以作为磁盘上的文件,这取决于您
- 应用程序在预定义路径中查找模块-在应用程序的目录中,在Qt插件路径中,在
QML2\u导入路径中,在您使用
engine->addImportPath()添加的目录中
qmldir
中的模块标识符应与目录相同
名称,模块实际驻留的位置。例如,如果您的模块
具有模块标识符模块测试。在qmldir
中,模块的
相对路径必须是测试/模块
QML2\u IMPORT\u PATH
(确保名称中有2
)env变量指向包含模块的目录。还有一个QQmlEngine::addImportPath
方法,它将目录添加到列表中以查找插件ldd
命令来检查它QT\u PLUGIN\u PATH
运行时变量可能有助于加载插件。它应该指向包含插件目录的目录,而不是插件目录本身QT\u DEBUG\u plugins=1
和QML\u IMPORT\u TRACE=1
环境变量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:/”)在加载QML之前,C++代码中需要代码来指示引擎在应用程序资源存储中查找QML模块。
RESOURCES+=MyModule/MyModule.qrc
需要在项目(.pro)文件中添加模块的文件到
项目文件中的QML\u IMPORT\u PATH+=$$PWD
告诉Qt Creator从项目源代码树的根开始查找模块。在我的例子中,我必须将其设置为一个子目录(例如,“ui/modules”),因为我的模块目录从那里开始。导入路径应包括所有模块目录下的根目录。据我所知,此指令仅适用于Qt Creator IDE,不会影响构建-这就是为什么需要#1的原因
qmldir文件的内容是原样的,但是它包含在模块的.qrc资源文件中是不直观的,除非您考虑