Qt Application plugin 理论指导

Qt 的插件系统分类2类,一类为Qt自身的扩展,一类为 Qt 应用程序的扩展。前面介绍过如 Customer Designer Widget 属于第一类。而我们自己用Qt开发的应用程序如果需要插件系统,则属于第二类。应用程序需要“检测”和“加载”插件。

通过插件使应用程序可扩展涉及以下步骤:

  1. 定义一组用于与插件对话的接口(仅具有纯虚函数的类)
  2. 使用 Q_DECLARE_INTERFACE() 宏告诉 Qt meta-object system 关于接口的信息
  3. 在应用程序中使用 QPluginLoader 加载插件
  4. 使用 qobject_cast() 测试插件是否实现了给定的接口。

编写插件涉及以下步骤:

  1. 声明一个插件类,继承自 QObject 和 该插件要提供的 interfaces
  2. 使用 Q_INTERFACES()  宏告诉Qt meta-object system 关于接口的信息
  3. 使用 Q_PLUGIN_METADATA() 宏导出插件
  4. 使用合适的 .pro 文件构建插件

回过头来再看 custom designer widget  插件,编写时需要有以下部分

#include <QtUiPlugin/QDesignerCustomWidgetInterface>

class MyXXXPlugin : public QObject, public QDesignerCustomWidgetInterface
{
    Q_OBJECT
    Q_INTERFACES(QDesignerCustomWidgetInterface)
    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidgetInterface")

public:
    MyXXXPlugin(QObject *parent = nullptr);

    bool isContainer() const;
    bool isInitialized() const;
    QIcon icon() const;
    QString domXml() const;
    QString group() const;
    QString includeFile() const;
    QString name() const;
    QString toolTip() const;
    QString whatsThis() const;
    QWidget *createWidget(QWidget *parent);
    void initialize(QDesignerFormEditorInterface *core);

};

再看头文件 <QtUiPlugin/QDesignerCustomWidgetInterface> 实际是 customwidget.h

class QDesignerCustomWidgetInterface
{
public:
    virtual ~QDesignerCustomWidgetInterface() {}

    virtual QString name() const = 0;
    virtual QString group() const = 0;
    virtual QString toolTip() const = 0;
    virtual QString whatsThis() const = 0;
    virtual QString includeFile() const = 0;
    virtual QIcon icon() const = 0;
    virtual bool isContainer() const = 0;
    virtual QWidget *createWidget(QWidget *parent) = 0;
    virtual bool isInitialized() const { return false; }
    virtual void initialize(QDesignerFormEditorInterface *core) { Q_UNUSED(core); }
    virtual QString domXml() const
    {
        return QString::fromUtf8("<widget class=\"%1\" name=\"%2\"/>")
            .arg(name()).arg(name().toLower());
    }
    virtual QString codeTemplate() const { return QString(); }
};

#define QDesignerCustomWidgetInterface_iid "org.qt-project.QDesignerCustomWidgetInterface"

Q_DECLARE_INTERFACE(QDesignerCustomWidgetInterface, QDesignerCustomWidgetInterface_iid)

符合以上要点。

参考两个例程:echoplugin 和 plugandpaint,位于 c:\Qt\Qt5.12.7\Examples\Qt-5.12.7\widgets\tools\ 路径下。

延伸阅读:

  • 制作Qt应用程序的插件(使用QtPlugin),对比DLL它是全平台通用的
    https://www.cnblogs.com/findumars/p/6375655.html

 

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.