Qt接口或抽象类和qobject_cast()

25

我有一组相当复杂的C++类,这些类是从Java重写的。每个类都有一个单独的继承类,并实现了一个或多个抽象类(或接口)。

是否可以使用qobject_cast()将类转换为其中一个接口?如果我将所有接口派生自QObject,由于不明确的QObject引用,我会得到一个错误。然而,如果我只有基类继承自QObject,我就无法使用qobject_cast(),因为它只能用于QObject

我希望能够通过其接口在插件和DLL之间传递类对象。


随着我进一步阅读文档,我不确定我想要做的事情是否可能......这不是好事。我可以使用基于RTTI的.dynamicCast<T>(),但听起来它并不总是适用于跨DLL边界的情况。 - Timothy Baldridge
我发现这个链接:https://dev59.com/xHA75IYBdhLWcg3wm6ax,所以我猜这个问题已经被问过了。 - Timothy Baldridge
1个回答

31
经过一些研究和阅读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
}

3
通常,人们使用 if (YourInterface *i = qobject_cast<YourInterface*>(c)) { }。这可以确保指针在无效时不被使用。 - Puppy
1
@DeadMG - 说得好,但我认为在if语句中放置=不是一个好的做法,因为很多人会将其与==混淆。 - Venemo
5
实际上,我经常看到上面那种模式的使用。仅仅因为人们不知道 = 和 == 的区别并不是使用或不使用它的好理由。就像没有理由不使用 ++i 和 i++ 一样,仅仅因为它们可能会混淆。 - Timothy Baldridge
@Venemo,向上转型怎么办?YourInterface *i = new YourClass(); YourClass *c = qobject_cast<YourClass*>(i); // qobject_cast 失败,但使用 static_cast 就可以。在这种情况下应该使用 static_cast 吗? - krdx
1
@krdx 不,你的接口绝对不应该继承QObject。 - Venemo
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接