我遵循Qt Echo Plugin
示例并尝试编写复杂的应用程序。我的项目具有以下结构:
MainDir
Main.pro
kernel
kernel.pro
abstractinterface.h
main.cpp
testplugin
testplugin.pro
abstractplugin.h
abstractplugin.cpp
问题出在插件头文件中:
#include <QObject>
#include <QtPlugin>
#include "abstractinterface.h"
class AbstractPlugin : public QObject, AbstractInterface
// An error appears here
// expected class-name before '{' token
{
Q_OBJECT
//... plugin initialization code ...
public:
explicit AbstractPlugin(QObject *parent = 0);
};
此外,自动完成找不到类抽象接口。
所以,问题是:我做错了什么?testplugin.pro
文件中,我有第 INCLUDEPATH += ../kernel/
行。
任何帮助表示赞赏。
----编辑-----
抽象接口.h
#include <QtPlugin>
#define INTERFACE_ID "AbstractInterface/1.0"
class AbstractInterface
{
public:
virtual ~AbstractInterface();
virtual void init();
virtual void enable();
virtual void disable();
};
Q_DECLARE_INTERFACE(AbstractInterface, INTERFACE_ID)
鉴于您粘贴的文件看起来正确并且可以在这里工作,我倾向于您的问题是这一行:
INCLUDEPATH += ../kernel/
您可能从主项目文件所在的项目根目录执行 qmake,递归调用 qmake 以生成生成文件。但是,在生成时,上述路径将从项目根目录而不是从子目录扩展。请改用以下命令修复您的testplugin.pro
项目文件:
INCLUDEPATH += $$PWD/../kernel/
但是,更好的设计是不要在该项目文件中处理它,而是在头文件所在的其他kernel.pro
中处理它。在那里添加这个是更灵活的设计:
INCLUDEPATH += $$PWD
编辑:根据您在原始问题中没有的评论,您似乎还有另一个问题。您似乎弄乱了两个不同文件中调用相同的包含保护,这就是为什么第二个包含没有为您提供可访问性的原因。