创建插件(Creating the plugin)

Qt Creator包含了一个创建QtQuick 2 QML Extension Plugin向导,我们使用它来创建一个叫做fileio
的插件,这个插件包含了一个从org.example.io中启动的FileIO对象。

插件类源于QQmlExtensionPlugin,并且实现了registerTypes()
函数。Q_PLUGIN_METADATA是强制标识这个插件作为一个qml扩展插件。除此之外没有其它特殊的地方了。

  1. #ifndef FILEIO_PLUGIN_H
  2. #define FILEIO_PLUGIN_H
  3. #include <QQmlExtensionPlugin>
  4. class FileioPlugin : public QQmlExtensionPlugin
  5. {
  6. Q_OBJECT
  7. Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
  8. public:
  9. void registerTypes(const char *uri);
  10. };
  11. #endif // FILEIO_PLUGIN_H

在实现registerTypes中我们使用qmlRegisterType函数注册了我们的FileIO类。

  1. #include "fileio_plugin.h"
  2. #include "fileio.h"
  3. #include <qqml.h>
  4. void FileioPlugin::registerTypes(const char *uri)
  5. {
  6. // @uri org.example.io
  7. qmlRegisterType<FileIO>(uri, 1, 0, "FileIO");
  8. }

有趣的是我们不能在这里看到模块统一资源标识符(例如org.example.io)。这似乎是从外面设置的。

看你查找你的项目文件夹是,你会发现一个qmldir文件。这个文件指定了你的qml插件内容或者最好是你插件中关于QML的部分。它看起来应该像这样。

  1. module org.example.io
  2. plugin fileio

模块是统一资源标识符,在统一标识符下插件能够被其它插件获取,并且插件行必须与插件文件名完全相同(在mac下,它将是libfileio_debug.dylib存在于文件系统上,fileioqmldir中)。这些文件由Qt Creator基于给定的信息创建。模块的标识符在.pro文件中同样可用。用来构建安装文件夹。

当你在构建文件夹中调用make install时,将会拷贝库文件到Qtqml
文件夹中(在Qt5.4之后mac上这将在~/Qt/5.4/clang_64/qml文件夹中。这个路径依赖Qt按住那个位置,并且使用系统上的编译器)。你将会在org/example/io文件夹中发现库文件。目前包含两个文件。

  1. libfileio_debug.dylib
  2. qmldir

当导入一个叫做org.example.io的模块时,qml引擎将会在导入路径下查找一个可用模块并且尝试使用qmldir文件定位org/example/io路径。qmldir会告诉引擎使用哪个模块标识符加在哪个库作为qml扩展插件。两个模块使用相同的统一标识符将会相互覆盖。