Qt接口或抽象类和qobject_cast()

时间:2010-09-16 12:39:48

标签: c++ qt interface qt4 qobject

我有一组相当复杂的C ++类,它们是用Java重写的。因此每个类都有一个继承的类,然后它还实现了一个或多个抽象类(或接口)。

是否可以使用qobject_cast()从一个类转换为其中一个接口?如果我从QObject派生所有接口,则由于QObject引用不明确而导致错误。但是,如果我只有从QObject继承的基类,则我无法使用qobject_cast(),因为它与QObject s一起使用。

我希望能够在它们的接口引用的插件和DLL之间抛出类。

1 个答案:

答案 0 :(得分:29)

经过一些研究和阅读the qobject_cast documentation,我发现了这个:

  

qobject_cast()也可用于   与接口结合;看到了   即插即用绘制示例详细信息。

以下是示例的链接:Plug & Paint

在挖掘示例中的interfaces header之后,我找到了Q_DECLARE_INTERFACE宏,它可以让你做你想做的事。

首先,从您的接口继承QObject。对于您拥有的每个接口,请使用Q_DECLARE_INTERFACE声明,如下所示:

class YourInterface
{
public:
    virtual void someAbstractMethod() = 0;
};

Q_DECLARE_INTERFACE(YourInterface, "Timothy.YourInterface/1.0")

然后在您的班级定义中,使用Q_INTERFACES宏,如下所示:

class YourClass: public QObject, public YourInterface, public OtherInterface
{
    Q_OBJECT
    Q_INTERFACES(YourInterface OtherInterface)

public:
    YourClass();

    //...
};

完成所有这些问题后,以下代码可以正常工作:

YourClass *c = new YourClass();
YourInterface *i = qobject_cast<YourInterface*>(c);
if (i != NULL)
{
    // Yes, c inherits YourInterface
}