Q_INTERFACES宏的目的是什么?

时间:2016-01-01 16:13:14

标签: c++ qt

我正在阅读其他人的代码并看到:

class UAVItem:public QObject,public QGraphicsItem
{
    Q_OBJECT
    Q_INTERFACES(QGraphicsItem)
...

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

    Q_INTERFACES(QGraphicsItem)

2 个答案:

答案 0 :(得分:8)

如果您的班级Derived继承自班级Base,而班级QObject继承自Derived,且BaseQ_OBJECT都包含qobject_cast宏,然后Base可用于从指针(或引用)安全地转换为Derived,指向({1}}的指针(或引用),类似于{标准C ++中的{1}}但没有RTTI。

如果dynamic_cast 继承自Base,那么QObject仍可以这种方式使用,但只有 qobject_cast具有相应的Base宏,Q_DECLARE_INTERFACE包含Derived

在您的情况下,Q_INTERFACES(Base)中存在Q_INTERFACES(QGraphicsItem)表示UAVItem可用于从指针(或引用)转换为qobject_cast指针(或虽然QGraphicsItem未从UAVItem继承,但QGraphicsItem仍为QObject

答案 1 :(得分:2)

来自reference doc

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)。这个'cast'函数的目标是根据iname返回一个指向接口的指针。   moc还会验证您放入的接口名称   Q_INTERFACES确实已经宣布。它可以通过检查来做到这一点   头文件并寻找Q_DECLARE_INTERFACE。在我们的例子中,   toolinterface.h中有一个Q_DECLARE_INTERFACE。