我有一堂课(MyClass
)从 Qt 内置对象继承了大部分功能(QGraphicsTextItem
). QGraphicsTextItem
间接继承自QObject
. MyClass
还实现了一个接口,MyInterface
.
class MyClass : public QGraphicsTextItem, public MyInterface
我需要能够使用connect
and disconnect
on MyInterface*
。但看来connect
and disconnect
只致力于QObject*
实例。由于 Qt 不支持 QObject 派生类的多重继承,因此我无法派生MyInterface
from QObject
。 (无论如何,这对于界面来说也没有多大意义。)
有一个在线讨论问题,但在我看来,建议的解决方案在常见情况下(通过其接口访问对象)相当无用,因为您无法连接来自MyInterface*
但必须将其强制转换为派生类型。自从MyClass
是众多之一MyInterface
- 派生类,这将需要“代码臭味” if-this-cast-to-this-else-if-that-cast-to-that 语句,并且违背了接口的目的。
有没有好的办法解决这个限制呢?
UPDATE:我注意到如果我dynamic_cast
a MyInterface*
to QObject*
(因为我know all MyInterface
-派生类最终也继承自QObject
,似乎有效。那是:
MyInterface *my_interface_instance = GetInstance();
connect(dynamic_cast<QObject*>(my_interface_instance), SIGNAL(MyInterfaceSignal()), this, SLOT(TempSlot()));
但是这个really似乎我在要求未定义的行为......
您自己找到了答案:dynamic_cast 按您的预期工作。这不是未定义的行为。如果您获得的 MyInterface 实例不是 QObject,则强制转换将返回 null,您可以防止这种情况发生(这不会发生,因为您说过该接口的所有实例也是 QObject)。但请记住,您需要打开 RTTI 才能使其工作。
我还想提供一些其他建议:
Use the Q_接口功能(不仅适用于插件)。然后,您可以根据 QObject 进行工作,并在真正需要时使用 qobject_cast 查询 MyInterface。我不详细了解你的问题,但既然你知道所有 MyInterface 实例也是 QObjects,这似乎是最明智的方法。
Add a QObject* asQObject()
MyInterface 的抽象方法并将其实现为{ return this; }
在所有子类中。
HavingQGraphicsTextItem(组合)而不是being一(继承)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)