我决定将我的爱好项目应用程序(字典查找程序)切换到插件体系结构,以便将来为其他语言开发各种不同的字典。该应用程序是使用Qt(5.0.2)在Visual C++中开发的。我加入这个头应用程序代码来定义词典插件接口:构建插件以扩展Qt应用程序
// dict_plugin.h
#ifndef DICT_PLUGIN_H
#define DICT_PLUGIN_H
#include <QtPlugin>
class PluginInterface
{
public:
virtual ~PluginInterface() {}
virtual QString language() const = 0;
virtual class QWidget* ui() const = 0;
};
Q_DECLARE_INTERFACE(PluginInterface, "pl.ksmvision.winona.PluginInterface")
#endif // DICT_PLUGIN_H
接下来,我创建了从插件本身的“Qt库”模板创建一个新的项目(使用Qt Visual Studio中添加 - 在)这是用来制作DLL的。主头文件看起来是这样的:
#ifndef JP_PLUGIN_H
#define JP_PLUGIN_H
// created by the template to define Q_DECL_EXPORT
// and _IMPORT macros but the plugin engine takes
// care of that (I think)
//#include "jp_plugin_global.h"
#include <QObject>
#include <QtPlugin>
#include <dict_plugin.h>
class JpPlugin : public QObject, public PluginInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "pl.ksmvision.winona.JpPlugin")
Q_INTERFACES(PluginInterface)
public:
JpPlugin();
virtual ~JpPlugin();
virtual QString language() const;
virtual QWidget* ui() const;
};
#endif // JP_PLUGIN_H
当我尝试建立这个,我得到的Q_INTERFACES行指定接口MOC错误我的插件是应该执行:
3 > ------建立开始:项目:jp_plugin,配置:调试Win32 ------
3> Moc'ing jp_plugin.h ...
3> F:\ moje \ src \ cpp \ winona \ build \ jp_plugin \ jp_plugin.h(15):error:Undefined interface
========== Build:2成功,1次失败,2次达成数据E,0已跳过==========
它看起来像moc'ing发生包含在dict_plugin.h文件之前,因为当我介绍一个错字到包括文件名,它不没有抱怨文件不存在,只是通过关于未定义的接口的相同错误消息来终止构建。
我在做什么错?谢谢。
不应该是'#include“dict_plugin.h”'? '<>'标题是系统标题。 ''“'包含自己的头文件。 – MSalters
不,因为dict_plugin头文件属于应用程序,并且所有插件都将其作为外部头文件包含它们,而不是它们自己的。另外,我不认为预处理器现在总是有一些该死的,“”和“>”似乎对所有头文件都完全相同。 – neuviemeporte
你错过了这一点。 MOC也需要包含标题,* IT *跳过标题。不是编译器的预处理器。 – MSalters