首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Q_INTERFACES宏的用途是什么?

Q_INTERFACES宏的用途是什么?
EN

Stack Overflow用户
提问于 2016-01-02 00:13:14
回答 2查看 9.7K关注 0票数 4

我正在阅读其他人的代码,并看到以下内容:

代码语言:javascript
复制
class UAVItem:public QObject,public QGraphicsItem
{
    Q_OBJECT
    Q_INTERFACES(QGraphicsItem)
...

但是我没有看到他们在这个程序中使用任何类型的插件。因此,我可以删除下面这行吗:

代码语言:javascript
复制
    Q_INTERFACES(QGraphicsItem)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-02 02:52:00

如果您有一个从类Base继承的类Derived,而该类又继承自QObject,并且DerivedBase都包含Q_OBJECT宏,那么可以使用qobject_cast安全地从指向Base的指针(或引用)转换到指向Derived的指针(或引用),类似于标准C++中的<代码>D9,但没有RTTI。

如果Base不是从QObject继承的,那么仍然可以以这种方式使用qobject_cast,但前提是Base具有相应的Q_DECLARE_INTERFACE宏,并且Derived包含Q_INTERFACES(Base)

在您的例子中,Q_INTERFACES(QGraphicsItem)出现在UAVItem中意味着qobject_cast可用于从指向QGraphicsItem的指针(或引用)转换为指向UAVItem的指针(或引用),尽管QGraphicsItem不是从QObject继承的。

票数 14
EN

Stack Overflow用户

发布于 2016-01-02 00:53:26

来自reference doc

代码语言:javascript
复制
class ToolInterface
{
public:
    virtual QString toolName() const = 0;
};
Q_DECLARE_INTERFACE(ToolInterface, "in.forwardbias.tool/1.0");

// Hammer in hammer.h (our Hammer plugin)
#include "toolinterface.h"
class Hammer : public QObject, public ToolInterface
{
    Q_OBJECT
    Q_INTERFACES(ToolInterface)
public:
    QString toolName() const { return "hammer"; }
};
Q_EXPORT_PLUGIN2(hammer, Hammer);

当moc在hammer.h代码上运行时,它会检查Q_INTERFACES。它为一个名为qt_metacall - void *Hammer::qt_metacast(const char *iname)的函数生成代码。这个‘强制转换’函数的目标是根据iname返回一个指向接口的指针。moc还会验证您放入Q_INTERFACES中的接口名称是否确实已声明。它可以通过检查头文件并查找Q_DECLARE_INTERFACE来做到这一点。在我们的示例中,toolinterface.h.

中有一个Q_DECLARE_INTERFACE

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

https://stackoverflow.com/questions/34557728

复制
相关文章

相似问题

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