Qt、多重继承、包装器或事件过滤器

Posted

技术标签:

【中文标题】Qt、多重继承、包装器或事件过滤器【英文标题】:Qt, multiple inheritance, wrappers or event filters 【发布时间】:2012-04-16 23:10:09 【问题描述】:

我有几个不同的基于 QGlWidget 的显示小部件,我需要将它们嵌入到基于 MDI 或 QDockwidget 的应用程序中。但我需要在我的显示小部件中处理一些 MDI/Dock 特定事件(最小化/停靠等)

选项是: 乘以从 QGlWidget 和 QMdiSubWindow/QDockWidget 继承显示小部件。多重继承和信号/槽有什么问题吗?

将显示器封装在 QMdiSubWindow/QDock 派生的小部件中,但我必须将显示器的所有外部函数包装在 Mdi/Dock 包装器小部件中。

当我创建一个新窗口时,创建一个临时 Mdi/Dock 小部件,将所有特殊信号连接到显示器中的插槽,然后将显示器连接到它并显示它。但这不适用于事件。

一些 QSignalMapper 魔术,我可以在 QGlWidget 中接收 QMdiSubWindow/QDockWidget 特定信号

【问题讨论】:

Qt 不支持在同一个对象中从 QObject 继承两次,所以假设 QGIWidget 是 QWidget 的子类,你的第一个选项是行不通的...... @JeremyFriesner - 谢谢,我认为它不起作用 【参考方案1】:

MDI/dock 小部件是其他小部件的容器,因此将它们的功能与显示小部件混合并不是一个很好的解决方案,因为您最终会得到一个看起来像容器的可怕混合小部件 - 但不能包含任何东西。并不是说 Qt 会像 Jeremy 所说的那样允许它。

如果您的 QGLWidget 需要来自其父容器的事件(例如最小化、停靠等),为什么您不能在 QGLWidget 中为它们创建伙伴方法,并在父容器执行操作时调用它们?

【讨论】:

这几乎是我认为我必须做的——我希望避免将每个 displayWidget 函数包装在容器小部件中,以便 mainWindow 菜单/工具栏等可以调用它们。而且由于容器可以容纳不同类型的显示,它还必须检查它所包含的内容。 有趣的是虽然dockwidget的设计不同,但它可以从任何QWidget继承,看起来更像是一个接口类型的类而不是一个纯容器。

以上是关于Qt、多重继承、包装器或事件过滤器的主要内容,如果未能解决你的问题,请参考以下文章

区块链开发之Solidity编程基础合约继承抽象合约接口

Qt 多重继承和信号

Qt中的多重继承

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

来自两个抽象类的多重继承 (Qt)

Qt中图元对象的多重集成