c++ - QGraphicsView 和装饰器模式

标签 c++ qt oop design-patterns

问题适用于类 QGraphicsView qt库的。 但是,问题更为普遍。所以,如果我没有遗漏 qt 中的任何特殊机制,它可能可以在不了解 qt 的情况下进行讨论。

我正在子类化 QGraphicsView添加一些我需要的功能。 例如。我有一个 ScalableView , PannableViewLabeledView添加独立功能。

我现在使用的子类化在以下意义上是线性的: ScalableView源自 QGraphics看法。 PannableView源自 ScalableView看法。 LabeledView源自 PannableView查看。

由于这些功能是独立的,因此存在设计缺陷。 应用装饰器模式 来解决这个问题似乎适合我。 问题是,QGraphicsView不是接口(interface),也不存在像QAbstractGraphicsView 这样的接口(interface)类。因此,对我来说,不清楚如何实现该模式。

另一种想法是使用模板。所以我可以从模板中导出每个 View T .然后,我可以制作类似 ScalableView<PannableView<LabeledView>>> 的实例.

您认为有更好的解决方案吗?在这种情况下,我更喜欢一种实现装饰器模式的方法,因为我想避免使用许多会增加编译时间的模板类。

最佳答案

Qt 风格的一个简单解决方案是创建一个派生自 QGraphicsView 的类,并且仅具有控制其行为的标志(无论是可缩放、可平移、标记等)。这些行为的实现仍然会被拆分成方法,所以它是 不像看起来那么单一。

装饰器模式当然可以通过定义一个中间(垫片)接口(interface)轻松实现。 QGraphicsView 不需要实现该接口(interface) - 该接口(interface)仅供装饰器使用。

深度继承的问题在于无法精细地控制行为的交互。您拥有的唯一控制是事件处理的顺序。这可能恰好就足够了,但这让我有些担心。没有修饰的装饰器模式也存在这个问题。

关于c++ - QGraphicsView 和装饰器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22379467/

相关文章:

c++ - OpenGL:带三角剖分的贝塞尔曲面

c++ - 将输入解释为十六进制数

delphi - 在 Delphi 中阻止函数被覆盖

C#如何继承默认构造函数

c++ - 这段代码是如何工作的,反转字符串的真正简短方法,它有效,但我不知道如何

c++ - 检查对象是否是基于基类的子类的实例

linux - 如何在Kcachegrind中查看源码

python - 将 C++ 类移植到 PyQt

c++ - QAbstractTableModel 并为单行发出 dataChanged

oop - 如何在 UML 序列图的自消息方法中绘制方法