Интерфейс в C ++ для Qt - PullRequest
       27

Интерфейс в C ++ для Qt

2 голосов
/ 12 декабря 2011

У меня вопрос, может ли мой интерфейс наследовать от QObject и как это сделать? Ну, я знаю, что интерфейсы в C ++ - это просто классы, которые содержат только виртуальные методы, и обычно класс может наследовать от суперкласса. Но если я сделаю это, я получу ошибку из-за неоднозначных ссылок на QObject. Мне нужно унаследовать QObject, чтобы добавить функцию сигналов / слотов в мои плагины.

Мой интерфейс

#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’

1 Ответ

2 голосов
/ 12 декабря 2011

Вы забыли реализовать

virtual void setLabelText() = 0;

Вы реализовали

void setTextForLabel();

Это опечатка?Чтобы создать экземпляр класса, вам необходимо переопределить и реализовать все чисто виртуальные методы в базовом классе.Поскольку вы этого не делаете, ваш класс остается абстрактным.

...