Qt接口或抽象类和qobject_cast()

Tim*_*dge 22 c++ qt interface qt4 qobject

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

是否可以使用qobject_cast()从类转换为其中一个接口?如果我从中导出所有接口QObject,由于模糊QObject引用,我会收到错误.但是,如果我只继承了基类QObject,我就无法使用,qobject_cast()因为它与QObjects一起运行.

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

Ven*_*emo 30

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

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

以下是示例的链接:即插即用.

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

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

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

Q_DECLARE_INTERFACE(YourInterface, "Timothy.YourInterface/1.0")
Run Code Online (Sandbox Code Playgroud)

然后在类定义中,使用Q_INTERFACES宏,如下所示:

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

public:
    YourClass();

    //...
};
Run Code Online (Sandbox Code Playgroud)

完成所有这些麻烦后,以下代码有效:

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

  • 实际上我已经看到上面使用的模式非常普遍.仅仅因为人们不知道=和==之间的区别不是使用或不使用它的好理由.就像没有理由不使用++ i vs i ++只是因为它们可能会混淆. (4认同)
  • 通常,人们使用`if(YourInterface*i = qobject_cast <YourInterface*>(c)){}`.这可确保指针在无效时永远不会被使用. (2认同)