2011-12-12 107 views
1

我的问题是,我的接口是否可以继承QObject以及如何做到这一点?那么,我知道C++中的接口只是只包含虚拟方法的类,通常一个类可以继承超类。但是,如果我这样做,我得到一个错误,由于模糊的QObject引用。我需要继承QObject来为我的插件添加信号/插槽功能。Qt中的C++接口

我的界面

#ifndef LABELINTERFACE_H 
#define LABELINTERFACE_H 

#include <QLabel> 
#include <QObject> 

class LabelInterface : public QObject { 

public : 

    virtual ~LabelInterface() {} 
    virtual QLabel* newLabel() = 0; 

public slots: 
    virtual void setLabelText() = 0; 
}; 

Q_DECLARE_INTERFACE (LabelInterface,"com.stefan.Plugin.LabelInterface/1.0") 

#endif // LABELINTERFACE_H 

插件头文件

#ifndef LABELPLUGIN_H 
#define LABELPLUGIN_H 

#include "labelinterface.h" 

class LabelPlugin : public LabelInterface 

{ 
    Q_OBJECT 
    Q_INTERFACES(LabelInterface) 

public: 

    QLabel* label; 
    QLabel* newLabel(); 
    LabelPlugin() {} 
    ~LabelPlugin() {} 

public slots: 
    void setTextForLabel(); 
}; 

#endif // LABELPLUGIN_H 

实现文件

#include <QtGui> 
#include "labelplugin.h" 

QLabel* LabelPlugin::newLabel() { 

    label = new QLabel("This plugin works"); 

    return label; 
} 

void LabelPlugin::setTextForLabel() { 

    label->setText("This plugin works fine"); 

} 

// Exporta plugin-ul 
Q_EXPORT_PLUGIN2 (labelplugin,LabelPlugin) 

我得到错误

labelplugin.cpp:18: error: cannot allocate an object of abstract type ‘LabelPlugin’ 
+0

显示一些代码。 –

+2

你有什么错误? –

+0

@LuchianGrigore已更新 – develoops

回答

2

你忘了执行

virtual void setLabelText() = 0; 

您实现了

void setTextForLabel(); 

是一个错字?要实例化一个类,您需要重写并实现基类中的所有纯虚方法。既然你没有这样做,你的课就是抽象的。