我正在阅读其他人的代码并看到:
class UAVItem:public QObject,public QGraphicsItem
{
Q_OBJECT
Q_INTERFACES(QGraphicsItem)
...
但我没有看到他们在这个程序中使用任何类型的插件。 因此,我可以删除该行:
Q_INTERFACES(QGraphicsItem)
答案 0 :(得分:8)
如果您的班级Derived
继承自班级Base
,而班级QObject
继承自Derived
,且Base
和Q_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)
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。