构建插件以扩展 Qt 应用程序
Posted
技术标签:
【中文标题】构建插件以扩展 Qt 应用程序【英文标题】:Building a plugin to extend a Qt application 【发布时间】:2013-07-06 14:07:32 【问题描述】:我决定将我的爱好项目应用程序(一个字典查找程序)转换为插件架构,以便将来能够为其他语言开发各种不同的字典。该应用程序是用带有 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 library”模板为插件本身(使用 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): 错误:未定义接口 ========== 构建:2 成功,1 失败,2 最新,0 跳过 ==========
看起来 moc'ing 发生在 dict_plugin.h 文件被包含之前,因为当我在包含文件名中引入拼写错误时,它不会抱怨该文件不存在,只是终止构建关于未定义接口的相同错误消息。
我做错了什么?谢谢。
【问题讨论】:
不应该是#include "dict_plugin.h"
吗? <>
标头是系统标头。 ""
中包含您自己的标头。
不,因为 dict_plugin 标头属于应用程序,所有插件都将其作为外部标头包含在内,而不是作为自己的标头。此外,我认为这些天预处理器无论如何都不在乎,“”和 似乎对所有标题都完全相同。
你没有抓住重点。 MOC 也需要包含标头,而 IT 会跳过该标头。不是编译器的预处理器。
啊,我明白了。好吧,因为一旦我添加了答案中所述的包含路径,MOC 就能够找到它,我想说很明显它不会跳过 包含。无论如何,我曾经认为不同之处在于“”用于当前目录中的标题,用于包含路径中的标题,而不是严格的系统和拥有。
您听说过 Mula 项目吗?我在 3 年前以完全相同的目的开始,并且很久以前就实施了所有这些。它在 KDE umbrello 下可用。
【参考方案1】:
moc 失败的原因是接口声明不可用。 #include 指令失败,因为找不到文件。显然,moc 可以自己处理#include 指令,但如果找不到要包含的文件,则不会(默认情况下?)打印错误消息或停止处理。
找不到带有接口声明的头文件的原因是 Qt VS 插件生成的导致 moc 被调用的自定义构建设置不继承项目的包含路径。我设法通过输入插件头文件的属性页,浏览到自定义构建工具->常规->命令行并在结尾。之后moc处理了header,构建成功。
【讨论】:
...今天帮我解决了问题 :-) 谢谢! 就我而言,moc 没有看到通过 连接的文件。替换包含“...”解决了问题 非常感谢。这个错误已经困扰了我好几天了。以上是关于构建插件以扩展 Qt 应用程序的主要内容,如果未能解决你的问题,请参考以下文章