我有一个类 (MyClass
),它继承了大部分的功能从Qt内置对象 (QGraphicsTextItem
)。 QGraphicsTextItem
间接继承自 QObject
。 MyClass
还实现了一个接口,MyInterface
。
class MyClass : public QGraphicsTextItem, public MyInterface
我需要能够在
MyInterface*
上使用 connect
和 disconnect
。但似乎 connect
和 disconnect
仅适用于 QObject*
实例。由于 Qt 不支持从 QObject 派生类进行多重继承,我无法从 QObject
派生 MyInterface
。(对于接口而言那也没有太多意义。)有一个在线讨论,但在常见情况下(通过其接口访问对象),我认为所提议的解决方案相当无用,因为你不能连接来自
MyInterface*
的信号和槽,而必须将其转换为派生类型。由于 MyClass
是许多 MyInterface
-派生类之一,这将导致“代码臭味”——if-this-cast-to-this-else-if-that-cast-to-that语句,并破坏了接口的目的。有没有好的解决此限制的方法?
更新:我注意到如果我将
MyInterface*
动态转换为 QObject*
(因为我“知道”所有的 MyInterface
-派生类最终都继承自 QObject
),它似乎可以工作。也就是说:MyInterface *my_interface_instance = GetInstance();
connect(dynamic_cast<QObject*>(my_interface_instance), SIGNAL(MyInterfaceSignal()), this, SLOT(TempSlot()));
但这似乎真的是要求未定义的行为...
MyInterfaceSignal
在MyInterface
中被声明为非信号的受保护纯虚方法,然后在派生类中被声明为信号。因此,编译器确保派生类具有该方法,但实现者需要将其标记为信号。这很奇怪,因为我并不是真的从MyInterface.MyInterfaceSignal
调用虚调用表,而是依赖于 SIGNAL 宏最终解析为char*
方法名的事实。 - Dave Mateer