加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 使用多重继承的Qt信号和插槽

发布时间:2020-12-16 03:05:58 所属栏目:百科 来源:网络整理
导读:我有一个类(MyClass),它从Qt内置对象(QGraphicsTextItem)继承其大部分功能. QGraphicsTextItem从QObject间接继承. MyClass还实现了一个接口MyInterface. class MyClass : public QGraphicsTextItem,public MyInterface 我需要能够在MyInterface *上使用连接
我有一个类(MyClass),它从Qt内置对象(QGraphicsTextItem)继承其大部分功能. QGraphicsTextItem从QObject间接继承. MyClass还实现了一个接口MyInterface.
class MyClass : public QGraphicsTextItem,public MyInterface

我需要能够在MyInterface *上使用连接和断开连接.但是看起来连接和断开只能在QObject *实例上工作.由于Qt不支持QObject派生类的多重继承,所以我无法从QObject派生MyInterface. (也不会对接口有意义)

有一个discussion of the problem online,但是,在通常情况下(通过其接口访问对象),提出的解决方案是相当无用的,因为您无法从MyInterface *连接信号和插槽,但必须将其转换为派生类型.由于MyClass是许多MyInterface派生类之一,所以这将需要“代码臭”if-this-cast-to-this-else-if-that-c??ast-to-the语句,并且不符合接口的用途.

这个限制有很好的解决方案吗?

更新:我注意到,如果我将一个MyInterface *到QObject *(因为我知道所有的MyInterface派生类也最终从QObject继承),它似乎工作,就是:

MyInterface *my_interface_instance = GetInstance();
connect(dynamic_cast<QObject*>(my_interface_instance),SIGNAL(MyInterfaceSignal()),this,SLOT(TempSlot()));

但这真的好像是我要求不明确的行为….

解决方法

你自己找到答案:dynamic_cast正如你所料.这不是未定义的行为.如果您获得的MyInterface的实例不是QObject,则转换将返回null,您可以保护自己(不会发生,因为您说接口的所有实例也是QObjects).不过请记住,您需要启用RTTI才能使其工作.

我还会提供一些其他建议:

>使用Q_INTERFACES功能(不仅适用于插件).那么当你真正需要的时候,你可以使用QObject和Qobject_cast来查询MyInterface.我不知道你的问题详细,但由于你知道所有的MyInterface实例也是QObjects,这似乎是最明智的做法.>将QObject * asQObject()抽象方法添加到MyInterface,并将其实现为{return this; }在所有子类.有一个QGraphicsTextItem(组合)而不是一个(继承).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读