Qt子目录包括类

时间:2014-12-05 00:23:09

标签: c++ qt qmake qtcore qtplugin

我遵循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);
};

此外,自动完成无法找到类AbstractInterface。

所以,问题是:我做错了什么?在testplugin.pro文件中,我有一行INCLUDEPATH += ../kernel/

任何帮助表示感谢。

----编辑-----
abstractinterface.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)

1 个答案:

答案 0 :(得分:2)

鉴于你的粘贴文件看起来正确并在这里工作,我倾向于你的问题是这一行:

INCLUDEPATH += ../kernel/

您可能从主项目文件所在的项目根目录执行qmake,以递归方式调用qmake来生成Makefile。但是,在生成时,上述路径将从项目根扩展而不是从子目录扩展。请修改您的testplugin.pro项目文件:

INCLUDEPATH += $$PWD/../kernel/

然而,更好的设计是不在项目文件中处理它,而是头文件所在的另一个kernel.pro。在那里添加它是更灵活的设计:

INCLUDEPATH += $$PWD

编辑:根据您在原始问题中没有的评论,您似乎还有其他问题。你似乎在两个不同的文件中混淆了相同的包含警卫,这就是为什么第二个包含没有导致为你提供可访问性。