1. 关于头文件 QGenericPlugin
和qgenericplugin.h
用Creator创建plugin工程时,有这一步 随后Creator就会创建几个文件,这些就不多说了。
看生成的test.h
文件:
#ifndef TEST_H
#define TEST_H
#include <QGenericPlugin>
class test : public QGenericPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID QGenericPluginFactoryInterface_iid FILE "untitled.json")
public:
explicit test(QObject *parent = nullptr);
private:
QObject *create(const QString &name, const QString &spec) override;
};
#endif // TEST_H
可以看到包含了QGenericPlugin
,这个文件的路径是C:\Qt\5.15.2\mingw81_64\include\QtGui\QGenericPlugin
,其内容只有一行
#include "qgenericplugin.h"
qgenericplugin.h
与QGenericPlugin
位于同一目录下,其内容是
#ifndef QGENERICPLUGIN_H
#define QGENERICPLUGIN_H
#include <QtGui/qtguiglobal.h>
#include <QtCore/qplugin.h>
#include <QtCore/qfactoryinterface.h>
QT_BEGIN_NAMESPACE
#define QGenericPluginFactoryInterface_iid "org.qt-project.Qt.QGenericPluginFactoryInterface"
class Q_GUI_EXPORT QGenericPlugin : public QObject
{
Q_OBJECT
public:
explicit QGenericPlugin(QObject *parent = nullptr);
~QGenericPlugin();
virtual QObject* create(const QString& name, const QString &spec) = 0;
};
QT_END_NAMESPACE
#endif // QGENERICPLUGIN_H
当然,这里定义的QGenericPlugin
类并不是一个完整的interface
,而官方文档以及许多文章里边说到interface
的时候,也没有提到这两个文件。
在实际项目中选择包含QGenericPlugin
,然后再派生出一个interface
,还是自己重新定义一个完整的interface
,并且使用一个自定义的新文件,其实都是可以的,这里只是提醒一下这个问题。
2. 关于接口的一致性
接口文件会存在于至少两个地方,一个是宿主项目中,一个是插件项目中,这时候就需要保证这两个地方的两个文件的一致性。
例如,在接口文件中,需要使用Q_DECLARE_INTERFACE
宏来声明一个接口:
Q_DECLARE_INTERFACE(Interface, "Interface.Plugin.QT")
这一句声明在两个文件中必须是一致的,否则程序运行时就会出现一些错误,比方说段错误。