# 创建插件
Qt Creator包含创建QtQuick 2 QML Extension Plugin的向导。在创建新项目时,可以在Library下找到此向导。 这里使用它来创建一个名为fileio
的插件,它带有一个在模块org.example.io
中启动的FileIO
对象。
提示
当前向导生成一个基于QMake的项目。 请使用本章的示例作为构建基于CMake项目的起点。
该项目应包含fileio.h
和fileio.cpp
(它们声明和实现了FileIO
类型)、fileio_plugin.cpp
(它包含允许QML引擎发现此扩展的实际插件类).
此插件类派生自QQmlEngineExtensionPlugin
类,包含Q_OBJECT
和Q_PLUGIN_METADATA
宏。 整个文件如下所示:
#include <QQmlEngineExtensionPlugin>
class FileioPlugin : public QQmlEngineExtensionPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid)
};
#include "fileio_plugin.moc"
该扩展将自动发现并注册所有标有QML_ELEMENT
和QML_NAMED_ELEMENT
的类型。 将在下面FileIO的实现部分查看这是如何完成的。
为了使模块的导入能够使用,用户还需要指定一个URI,例如import org.example.io
。 有趣的是,在任何地方都看不到模块的URI。 这是使用qmldir
文件从外部设置的,或者在项目的CMakeLists.txt
文件中设置的。
qmldir
文件指定了QML插件的内容,或者更好地指定了插件在QML端的导入内容。 手写的插件的qmldir
文件应如下所示:
module org.example.io
plugin fileio
模块是用户要导入的URI,在它之后命名为该URI加载哪个插件。 插件行使用的名称必须与插件的文件名相同(在qmldir中是名称为fileio的插件,在mac中对应的文件系统中名称为libfileio_debug.dylib,在Linux系统中文件系统中文件名为libfileio.so)。 这些文件由Qt Creator根据给定的信息创建。
创建正确的qmldir
文件的更简单方法是在项目的CMakeLists.txt
文件中的qt_add_qml_module
宏中声明。 在这里,URI
参数用于指定插件的URI,例如org.example.io
。 这样设置后,在构建项目时就会生成qmldir
文件。
TODO
如何安装模块?
当导入名为"org.example.io"的模块时,QML引擎将查看其中一个导入路径并尝试使用qmldir定位"org/example/io"路径。 然后qmldir将告诉引擎使用哪个模块URI作为QML扩展插件时加载哪个库。 具有相同URI的两个模块将会相互覆盖。