24

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

是否可以使用qobject_cast()从类转换为接口之一?如果我从 派生所有接口QObject,则会由于QObject引用不明确而出现错误。但是,如果我只有从 继承的基类QObject,则不能使用qobject_cast(),因为它与QObjects 一起使用。

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

4

1 回答 1

32

经过一些研究和阅读qobject_cast 文档后,我发现了这一点:

qobject_cast() 也可以和接口一起使用;有关详细信息,请参阅 Plug & Paint 示例。

这是示例的链接:Plug & Paint

在挖掘示例中的接口标头后,我找到了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
}
于 2010-09-16T12:57:01.110 回答