【问题标题】:Qt interfaces or abstract classes and qobject_cast()Qt 接口或抽象类和 qobject_cast()
【发布时间】:2011-04-13 04:57:39
【问题描述】:

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

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

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

【问题讨论】:

  • 当我阅读更多文档时,我不确定我想做的事情是否可行……这并不好。我可以使用基于 RTTI 的 .dynamicCast() 但它听起来并不总是可以跨 DLL 边界工作。
  • 我发现了这个:stackoverflow.com/questions/3201273/… 所以我猜它已经被问过了。

标签: c++ qt interface qt4 qobject


【解决方案1】:

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

【讨论】:

  • 啊!凉爽的。我试过 Q_DECLARE_INTERFACE,但没有将 Q_INTERFACES 添加到派生对象。感谢您的帮助。
  • 通常,人们使用if (YourInterface *i = qobject_cast&lt;YourInterface*&gt;(c)) { }。这样可以确保指针在无效时永远不会被使用。
  • @DeadMG - 好点,但我不认为将= 放入if 语句是一个好习惯,因为很多人将它与== 混淆。
  • 实际上我已经看到上面的模式非常常用。仅仅因为人们不知道 = 和 == 之间的区别并不是使用或不使用它的好理由。就像没有理由不使用 ++i 与 i++ 只是因为它们可能会混淆。
  • @krdx 不,你的接口绝对不应该继承 QObject。
猜你喜欢
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
  • 2017-02-19
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 2012-08-07
相关资源
最近更新 更多