该问题适用于qt库的QGraphicsView类。
但是,问题更普遍。因此,如果我在qt中不缺少任何特殊的机制,则可能在不了解qt的情况下进行讨论。

我将QGraphicsView子类化以添加一些我需要的功能。
例如。我有一个ScalableViewPannableViewLabeledView来添加独立的功能。

我现在使用的子激光在以下意义上是线性的:ScalableView源自QGraphics View 。PannableView源自ScalableView View 。LabeledView源自PannableView View 。

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

一个不同的想法是使用模板。因此,我可以从模板T派生每个 View 。然后,我可以像ScalableView<PannableView<LabeledView>>>这样进行实例化。

您是否看到任何更好的解决方案?我希望在这种情况下实现装饰器模式,因为我希望避免使用许多会增加编译时间的模板类。

最佳答案

Qt风格的一个简单解决方案是创建一个从QGraphicsView派生的类,并仅具有控制其行为的标志(无论它是否可缩放,可平移,带有标签等)。这些行为的实现仍将拆分为方法,因此
不像看起来那样单片。

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

深度继承的问题在于,不可能很好地控制行为的交互。您拥有的唯一控件是事件处理的顺序。这可能就足够了,但是让我有些担心。在没有修饰的情况下实现的装饰器模式存在此问题。

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

10-12 23:40