【发布时间】:2010-07-15 20:25:07
【问题描述】:
我有一个类 (MyClass),它从 Qt 内置对象 (QGraphicsTextItem) 继承了它的大部分功能。 QGraphicsTextItem 间接继承自 QObject。 MyClass 也实现了一个接口,MyInterface。
class MyClass : public QGraphicsTextItem, public MyInterface
我需要能够在MyInterface* 上使用connect 和disconnect。但似乎connect 和disconnect 仅适用于QObject* 实例。由于 Qt 不支持从 QObject 派生类进行多重继承,因此我无法从 QObject 派生 MyInterface。 (无论如何,这对于界面来说也没有多大意义。)
有一个discussion of the problem online,但 IMO 建议的解决方案在常见情况下(通过其接口访问对象)相当无用,因为您无法连接来自 MyInterface* 的信号和插槽,但必须将其转换为派生-类型。由于MyClass 是许多MyInterface 派生类之一,这将需要“代码异味” if-this-cast-to-this-else-if-that-cast-to-that 语句并违背了界面。
这个限制有什么好的解决办法吗?
更新:我注意到如果我将dynamic_cast 一个MyInterface* 转换为QObject*(因为我知道所有MyInterface 派生类最终也继承自QObject,好像可以了。就是:
MyInterface *my_interface_instance = GetInstance();
connect(dynamic_cast<QObject*>(my_interface_instance), SIGNAL(MyInterfaceSignal()), this, SLOT(TempSlot()));
但是这真的似乎我在要求未定义的行为....
【问题讨论】:
-
您如何以及在何处声明 MyInterfaceSignal?
-
MyInterfaceSignal在MyInterface中被声明为一个非信号受保护的纯虚方法,然后在派生类中作为一个信号。因此,编译器确保派生类具有该方法,但由实现者将其标记为信号。这很糟糕,因为我不是真的从MyInterface.MyInterfaceSignal调用虚拟调用表,而是依赖于SIGNAL 宏在一天结束时只是解决的事实到char*方法名称。
标签: c++ qt multiple-inheritance qt-signals