c++ - 使用具有多重继承的 Qt 信号和槽

标签 c++ qt multiple-inheritance qt-signals

我有一个类 (MyClass),它从 Qt 内置对象 (QGraphicsTextItem) 继承了大部分功能。 QGraphicsTextItem 间接继承自QObjectMyClass 还实现了一个接口(interface),MyInterface

class MyClass : public QGraphicsTextItem, public MyInterface

我需要能够在 MyInterface* 上使用 connectdisconnect。但是 connectdisconnect 似乎只适用于 QObject* 实例。由于 Qt 不支持从 QObject 派生类的多重继承,我无法从 QObject 派生 MyInterface。 (无论如何,这对于界面也没有多大意义。)

有一个discussion of the problem online ,但 IMO 建议的解决方案在常见情况下(通过其接口(interface)访问对象)相当无用,因为您无法连接来自 MyInterface* 的信号和插槽,但必须将其转换为派生类型。由于 MyClass 是许多 MyInterface 派生类之一,这将需要“代码臭味”if-this-cast-to-this-else-if-that-c​​ast -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()));

但这真的好像我在要求未定义的行为....

最佳答案

您自己找到了答案:dynamic_cast 的工作方式与您预期的一样。这不是未定义的行为。如果您获得的 MyInterface 实例不是 QObject,则强制转换将返回 null,您可以防止这种情况发生(这不会发生,因为您说过接口(interface)的所有实例也是 QObject)。但是请记住,您需要打开 RTTI 才能工作。

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

  • 使用Q_INTERFACES 功能(它不仅适用于插件)。然后,您将根据 QObject 进行工作,并在真正需要时使用 qobject_cast 查询 MyInterface。我不详细了解您的问题,但由于您知道所有 MyInterface 实例也是 QObject,这似乎是最明智的方法。

  • 向MyInterface 添加一个QObject* asQObject() 抽象方法并将其实现为{ return this; 在所有子类中。

  • 拥有一个 QGraphicsTextItem(组合)而不是一个(继承)。

关于c++ - 使用具有多重继承的 Qt 信号和槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3259728/

相关文章:

c++ - MFC 列表框中的复选框在 VS2015 中显示不同

c++ - 服务的静态和动态演化

visual-studio - Qt VS Tools 在 Visual Studio 2019 中不起作用

Python:从父类(super class)构造多重继承子类实例

oop - 多重继承批评

c++ - 如何在 Win32 上使用 C++ 安装硬件驱动程序?

c++ - 是否有 "single mutex deadlock"的术语(非递归互斥的死锁类型情况)?

c++ - Qt QApplication::commitData、Windows 关闭、困惑的文档

qt - QSslSocket:无法解析 SSLV2_client_method

python - 检测 super() 是否有带有装饰器的函数?