首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >子类是否需要Q_INTERFACES宏?

子类是否需要Q_INTERFACES宏?
EN

Stack Overflow用户
提问于 2022-04-27 11:10:19
回答 1查看 81关注 0票数 3

如果我有实现接口的类A (并使用Q_INTERFACES宏),那么子类B : public A也需要使用Q_INTERFACES宏吗?

例如:

IMovable.h

代码语言:javascript
运行
复制
#include <QObject>

class IMovable
{
public slots:
    virtual void moveLeft(int distance) = 0;
    virtual void moveRight(int distance) = 0;
    virtual void moveUp(int distance) = 0;
    virtual void moveDown(int distance) = 0;
signals:
    virtual void moved(int x, int y) = 0;
};

Q_DECLARE_INTERFACE(IMovable, "my_IMovable")

A.h

代码语言:javascript
运行
复制
#include <QObject>
#include "IMovable.h"

class A : public QObject, public IMovable
{
    Q_OBJECT
    Q_INTERFACES(IMovable)
public:
    explicit A(QObject *parent = nullptr);
    virtual ~A();

public slots:
    //implement IMovable public slots
    void moveLeft(int distance) override;
    void moveRight(int distance) override;
    void moveUp(int distance) override;
    void moveDown(int distance) override;

signals:
    //implement IMovable signals
    void moved(int x, int y) override;
};

B.h

代码语言:javascript
运行
复制
#include "A.h"

class B : public A
{
    Q_OBJECT
    // Do I need Q_INTERFACES(IMovable) here?
    ...
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-01 05:48:25

需要Q_INTERFACES才能使qobject_cast函数与类实现的接口正确工作。因此,如果要使用这个函数,就必须将Q_INTERFACES放在类中。

Docs不清楚继承会发生什么,但是生成的qt_metacast函数的实现总是调用父qt_metacast。因此,在您的示例中,即使您没有将Q_INTERFACES宏放入B类,它仍然应该使用qobject_cast函数,因为它将传递给A来执行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72027739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档