构建一个扩展Qt应用程序的插件

时间:2013-07-06 14:07:33

标签: c++ qt plugins moc

我决定将我的爱好项目应用程序(字典查找程序)切换到插件架构,以便将来为其他语言开发各种不同的字典。该应用程序是使用Qt(5.0.2)在Visual C ++中开发的。我将此标头添加到应用程序代码中以定义字典插件的接口:

// 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 Visual Studio插件)的“Qt库”模板创建了一个新项目,该模板用于生成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&gt; ------构建开始:项目:jp_plugin,配置:调试Win32 ------
  3 GT; Moc'ing jp_plugin.h ...
  3&gt; F:\ moje \ src \ cpp \ winona \ build \ jp_plugin \ jp_plugin.h(15):错误:未定义的界面
  ==========构建:2成功,1失败,2最新,0跳过==========

看起来moc'ing发生在包含dict_plugin.h文件之前,因为当我向include文件名引入一个拼写错误时,它不会抱怨该文件不存在,只是用这个文件终止构建有关未定义接口的相同错误消息。

我做错了什么?感谢。

1 个答案:

答案 0 :(得分:6)

moc失败的原因是因为接口声明不可用。 #include指令失败,因为找不到该文件。显然,moc可以自己处理#include指令,但是如果找不到要包含的文件,则不会(默认情况下?)打印错误消息或停止处理。

无法找到带有接口声明的头文件的原因是,导致调用由Qt VS加载项生成的moc的自定义构建设置不会继承项目的包含路径。我设法通过输入插件头文件的属性页面,浏览到自定义构建工具 - &gt; General-&gt;命令行并添加额外的“-I ...”include选项,手动将所需路径添加到moc的命令行在末尾。之后,moc处理了标题,构建成功。