创建插件(Creating the plugin)

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

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

#ifndef FILEIO_PLUGIN_H
#define FILEIO_PLUGIN_H

#include <QQmlExtensionPlugin>

class FileioPlugin : public QQmlExtensionPlugin
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")

public:
    void registerTypes(const char *uri);
};

#endif // FILEIO_PLUGIN_H

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

#include "fileio_plugin.h"
#include "fileio.h"

#include <qqml.h>

void FileioPlugin::registerTypes(const char *uri)
{
    // @uri org.example.io
    qmlRegisterType<FileIO>(uri, 1, 0, "FileIO");
}

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

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

module org.example.io
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文件夹中发现库文件。目前包含两个文件。

libfileio_debug.dylib
qmldir

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