c++ - 构建插件以扩展 Qt 应用程序

标签 c++ qt plugins moc

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

// 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 中收到一个错误,指定我的插件应该实现的接口(interface):

3>------ Build started: Project: jp_plugin, Configuration: Debug 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 succeeded, 1 failed, 2 up-to-date, 0 skipped ==========

看起来 moc'ing 发生在包含 dict_plugin.h 文件之前,因为当我在包含文件名中引入拼写错误时,它不会提示该文件不存在,只是终止构建关于未定义接口(interface)的相同错误消息。

我做错了什么?谢谢。

最佳答案

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

找不到带有接口(interface)声明的头文件的原因是Qt VS插件生成的导致调用moc的自定义build设置没有继承项目的包含路径。我设法通过输入插件头文件的属性页,浏览到自定义构建工具->常规->命令行并在结尾。之后moc处理header,构建成功。

关于c++ - 构建插件以扩展 Qt 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17503724/

相关文章:

c++ - 在特征库中的大矩阵中创建子矩阵

c++ - 使用 Qt 在 Mac 上设置表单行,如 iTunes 信息对话框

c++ - QAbstractItemModel::removeRows 会导致内存泄漏吗?

c++ - 为什么某些局部类型声明在 C++ 中以 'struct' 为前缀

c++ - 开关函数输入不起作用 (C++)

c++ - 我们能得到一个 lambda 参数的类型吗?

c++ - setStyleSheet 固定字体,不再更新字体传播

maven - 在 allure reporter 文件夹中找不到 pom.xml 文件

plugins - Notepad++插件同时编辑开始和结束的html标签

linux - 如何在 Linux 上仅使用 Gecko-sdk 构建 mozilla firefox NSAPI 示例插件