一、定义插件的宏
头文件定义了用于定义插件的宏:
- Q_DECLARE_INTERFACE(ClassName, Identifier)
- Q_IMPORT_PLUGIN(PluginName)
- Q_PLUGIN_METADATA(…)
- Q_INTERFACES(…)
文档
Q_DECLARE_INTERFACE(ClassName, Identifier)
这个宏将给定的标识符(一个字符串字面值)与名为ClassName的接口类关联起来。标识符必须唯一。例如:
#define BrushInterface_iid "org.qt-project.Qt.Examples.PlugAndPaint.BrushInterface/1.0"
Q_DECLARE_INTERFACE(BrushInterface, BrushInterface_iid)
这个宏通常被用在ClassName的类定义之后,在头文件中。详细信息请参见Plug & Paint示例。
如果你想在命名空间中声明的接口类中使用Q_DECLARE_INTERFACE,那么你必须确保Q_DECLARE_INTERFACE不在命名空间中。例如:
namespace Foo
{
struct MyInterface { ... };
}
Q_DECLARE_INTERFACE(Foo::MyInterface, "org.examples.MyInterface")
Q_DECLARE_INTERFACE(ClassName, Identifier)
这个宏导入名为PluginName的插件,它与用Q_PLUGIN_METADATA()为插件声明元数据的类的名称相对应。
将这个宏插入到应用程序的源代码中可以使用静态插件。
例子:
Q_IMPORT_PLUGIN(qjpeg)
在构建应用程序时,静态插件也必须包含在链接器中。对于Qt预定义的插件,您可以使用QTPLUGIN来添加所需的插件到您的构建中。例如:
TEMPLATE = app
QTPLUGIN += qjpeg qgif # image formats
Q_PLUGIN_METADATA(...)
这个宏被用来声明元数据,元数据是实例化这个对象的插件的一部分。
宏需要声明通过对象实现的接口的IID,并引用包含插件元数据的文件。
在Qt插件的源代码中,这个宏应该只出现一次。
例子:
class MyInstance : public QObject
{
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDummyPlugin" FILE "mymetadata.json")
};
注意,这个宏出现的类必须是默认可构造的。
FILE是可选的,指向json文件。
json文件必须驻留在构建系统指定的包含目录中。当无法找到指定文件时,Moc退出并报错。
Q_INTERFACES(...)
这个宏告诉Qt这个类实现了哪些接口。这是在实现插件时使用的。
例子:
class BasicToolsPlugin : public QObject,
public BrushInterface,
public ShapeInterface,
public FilterInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.Examples.PlugAndPaint.BrushInterface" FILE "basictools.json")
Q_INTERFACES(BrushInterface ShapeInterface FilterInterface)
public:
...
};