Qt 插件使用总结

3 篇文章 0 订阅

一、定义插件的宏

头文件定义了用于定义插件的宏:

  • 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:
      ...
  };

二、拓展Qt应用程序(插件)

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值