C++ 中的接口对于 Qt

发布于 2024-12-21 04:07:39 字数 1406 浏览 2 评论 0原文

我的问题是,我的接口可以从 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’

My question is , can my interface inherit from QObject and how to do that ? Well , i know that interfaces in C++ are simply classes that contains only virtual methods , and normally a class can inherit from a superclass. But if i do so i get an error due to ambiguous QObject references. I need to inherit QObject to add signals /slot feature to my plugins.

My interface

#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

Plugin header file

#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

Implementation file

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

I get error

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

葬心 2024-12-28 04:07:39

你忘记实施

virtual void setLabelText() = 0;

你实施了

void setTextForLabel();

这是一个错字吗?要实例化一个类,您需要重写并实现基类中的所有纯虚方法。由于您没有这样做,因此您的类仍然是抽象的。

You forgot to implement

virtual void setLabelText() = 0;

You implemented

void setTextForLabel();

was that a typo? To instantiate a class you need to override and implement all pure virtual methods in the base class. Since you're not doing that, you class remains abstract.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文