QGraphicsView 框架学习(六) 设计问题

原创 2015年07月06日 17:46:29

书到用时方恨少啊,遇到一个设计问题,为了给QGraphicsItem添加一些特性,比如给它们添加一个选择框,提供resize操作,前面用的方法是子类化这个类,现在发现这个方法挺麻烦的。赶快翻书,《设计模式》给出了Adapter等结构模式,《设计模式新思维》给出了模板实现设计模式的方法,目前的问题是尽量利用Qt提供的现成的类,尽量复用现有的工具,那么就 Adapter+template吧。可是问题又来啦,我们需要动多态啊,item需要动态绑定啊,没找到template动态绑定的方法,只能自己做实验了。
定义一个模板基类,模板参数传递一个QGraphicsItem类型。我们可以实现不同的子类来完成QGraphicsItem的resize操作,而不用对QGraphicsItem类型做修改。这个类,提供了两个方法,resize用来改变图形大小。另外一个给图形添加文本。

template < typename T >
class AbstractControl
{
public:
AbstractControl( T * shape )
    :m_shape(shape)
{}
    virtual void reszie( int handle , const QPointF & point ){
    qDebug()<<"AbstractControl:"<< m_shape->boundingRect();
}
virtual void setText( const QString& text ) {}
protected:
~AbstractControl(){}
T * m_shape;
};
// 适配QGraphicsSimpleTextItem对象
template < typename T >
class NullControl : public AbstractControl<T>
{
public:
NullControl( T * shape )
    :AbstractControl<T>(shape)
{}
void reszie( int handle , const QPointF & point ){

    qDebug()<<"NullControl:"<< AbstractControl<T>::m_shape->boundingRect();
}
void setText(const QString& text )
{
    AbstractControl<T>::m_shape->setText(text);
}
};

//矩形对象
template < typename T >
class RectControl : public AbstractControl<T>
{
public:
RectControl( T * shape )
    :AbstractControl<T>(shape)
{}
void reszie( int handle , const QPointF & point ){
    AbstractControl<T>::m_shape->setRect(-50,-50,100,100);
    qDebug()<<"RectControl:"<< AbstractControl<T>::m_shape->boundingRect();
}
};

//椭圆对象
template < typename T >
class EllipseControl : public AbstractControl<T>
{
public:
EllipseControl( T * shape )
    :AbstractControl<T>(shape)
{}
void reszie( int handle , const QPointF & point ){
    AbstractControl<T>::m_shape->setRect(-50,-50,100,100);
    AbstractControl<T>::m_shape->setStartAngle(30*16);
    AbstractControl<T>::m_shape->setSpanAngle(120*16);
    qDebug()<<"EllipseControl:"<< AbstractControl<T>::m_shape->boundingRect();
}
};

//定义一个图元,多重继承 AbstractControl和QGraphicsItem类,我们可以在这里继续给它添加一些通用功能。

template < class BaseType , template<class> class Control >
class RCShape : public Control < BaseType >
           ,public BaseType
{
public:
RCShape(QGraphicsItem * parent = 0 )
    : Control< BaseType >( this ),BaseType(parent)
{
    BaseType::setFlag(QGraphicsItem::ItemIsMovable, true);
    BaseType::setFlag(QGraphicsItem::ItemIsSelectable, true);
    BaseType::setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
    this->setAcceptHoverEvents(true);
}
};

//template的动态多态,不知道真正的template是怎么实现动多态的,反正我就是这么实现的。

//声明了一个基本类型做我接口类,模板参数选择的是 QGraphicsItem,和AbstractControl类,它们同样都是基本的接口类型。

    typedef RCShape<QGraphicsItem,AbstractControl> AbstractShape;

//动态绑定
//相当于

// class RCShape : public EllipseControl , public QGraphicsEllipseItem;

AbstractShape *item = qgraphicsitem_cast<AbstractShape*> (new   RCShape<QGraphicsEllipseItem , EllipseControl >);
item->reszie(0,QPointF());
item->setPos(scene->sceneRect().center());
scene->addItem(item);

//动态绑定
//相当于
//class RCShape : public RectControl , public QGraphicsRectItem;

AbstractShape *item1 = qgraphicsitem_cast<AbstractShape*> (new  RCShape<QGraphicsRectItem , RectControl > );
item1->reszie(0,QPointF());
item1->setPos(300,300);
scene->addItem(item1);

//动态绑定
//相当于
//class RCShape : public NullControl , public QGraphicsSimpleTextItem;

AbstractShape *item2 = qgraphicsitem_cast<AbstractShape*> (new   RCShape<QGraphicsSimpleTextItem , NullControl > );
item2->reszie(0,QPointF());
item2->setText(tr("Demo C++ Template Dynamic Polymorphism"));
item2->setPos(300,200);
scene->addItem(item2);

总结,mixin模式模板类作为接口类,实现动多态也是可以的,但是需要对多重继承的父类定义抽象接口,声明一个完全都是基本类型的模板类做接口对象的类型。然后通过dynamic_cast实现动态绑定。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

QGraphicsItem中的碰撞检测描述

QGraphicsItem中的碰撞检测描述     QGraphicsItem是图元基类。QGraphics View框架提供了几种标准的图元,如矩形(QGraphicsRectItem、椭圆(QG...

Qt图形视图QGraphicsItem类

QGraphicsItem类是视图框架的一部分,是在一个QGraphicsScene中最基本的图形类,它为绘制你自己的item提供了一个轻量级的窗口,包括声明item的位置,碰撞检测,绘制重载和ite...

Qt 自学QGraphicsItem要点 积累

1.在创建QGraphicsItem子类的时候,想要实现自己绘图,一般是重新实现boundingRect()和paint()函数,如果不重新实现shape(),基类的实现将会退而使用 bounding...

Qt图形框架资料07 -- Qt图形视图QGraphicsItem类

Qt图形视图QGraphicsItem类 详细介绍 QGraphicsItem类是视图框架的一部分,是在一个QGraphicsScene中最基本的图形类,它为绘制你   自己的item提供了一个轻量级...

QGraphicsItem

这个类翻译了好久,实在是成员函数太多了,分享出来,希望对大家有用,多多支持哦~~   详细介绍 QGraphicsItem类是视图框架的一部分,是在一个QGraphicsScene中最基本的图形...
  • ldw614
  • ldw614
  • 2013-07-12 15:21
  • 1751

Qt浅谈之四十四动态显示日志(QGraphicsItem)

一、简介         在QGraphicsItem中使用QGraphicsItemAnimation和QTimeLine来实现动画的显示。其中的数据都是测试数据,仅为显示动画效果。 ...

自定义QGraphicsItem

QGraphicsItem 是场景中 item 的基类。图形视图提供了一些典型形状的标准 item,例如:矩形 ( QGraphicsRectItem )、椭圆 ( QGraphicsEllipseI...

QGraphicsItem 对象鼠标移动

QGraphicsItem是QGraphicsRectItem,QGraphicsLineItem等类的父类; QGraphicsRectItem可以绘制到QGraphicsScene上,QGraph...

QGraphicsView 框架学习(一)、图形元素的编辑

一、给图形对象加控制点,用户通过鼠标来操作控制点来编辑图形,参考MFC drawcli的实现。 很多人通过QGraphicsItem的派生类,然后重载几个函数来处理鼠标消息: void mou...

QGraphicsView 框架学习(一)、图形元素的编辑

代码在 http://download.csdn.net/detail/firebolt2002/8782273 一、给图形对象加控制点,用户通过鼠标来操作控制点来编辑图形,参考MFC dr...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)