当前位置:嗨网首页>书籍在线阅读

23-自定义QWChartView类

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

9.4.2 自定义QWChartView类

QChart和QChartView是基于Graphics View结构的绘图类,要对一个QChart图表进行鼠标和按键操作,需要在QChartView组件里对鼠标和按键事件进行处理,这就需要自定义一个从QChartView继承的类,这与实例samp8_5中从QGraphicsView继承一个自定义图形视图类,实现鼠标和按键操作的原理类似。

自定义一个QWChartView类,它从QChartView继承而来,对鼠标和按键事件进行处理。QWChartView类的定义如下:

class QWChartView : public QChartView
{
   Q_OBJECT
private:
   QPoint  beginPoint; //选择矩形区的起点
   QPoint  endPoint;  //选择矩形区的终点
protected:
   void mousePressEvent(QMouseEvent *event); //鼠标左键按下
   void mouseMoveEvent(QMouseEvent *event); //鼠标移动
   void mouseReleaseEvent(QMouseEvent *event); //鼠标释放左键
   void keyPressEvent(QKeyEvent *event); //按键事件
public:
   explicit QWChartView(QWidget *parent = 0);
   ~QWChartView();
signals:
   void mouseMovePoint(QPoint point); //鼠标移动信号
};

QWChartView类中定义了两个私有变量beginPoint和endPoint用于鼠标框选矩形区域的起点和终点。QWChartView重定义了鼠标的3个事件函数和键盘按键事件的函数,定义了一个信号mouseMovePoint(QPoint point),在mouseMoveEvent()事件里发射此信号并传递鼠标光标处的屏幕坐标,用于在主窗口里实现鼠标在图表上移动时显示当前位置的坐标。

下面是QWChartView类各个函数的实现。

QWChartView::QWChartView(QWidget *parent):QChartView(parent)
{//构造函数
   this->setDragMode(QGraphicsView::RubberBandDrag);
   this->setMouseTracking(true);//必须开启此功能,缺省为false
}
void QWChartView::mousePressEvent(QMouseEvent *event)
{//鼠标左键按下,记录beginPoint
   if (event->button()==Qt::LeftButton)
      beginPoint=event->pos();
   QChartView::mousePressEvent(event);
}
void QWChartView::mouseMoveEvent(QMouseEvent *event)
{//鼠标移动事件
   QPoint  point=event->pos();
   emit mouseMovePoint(point);
   QChartView::mouseMoveEvent(event);
}
void QWChartView::mouseReleaseEvent(QMouseEvent *event)
{//鼠标左键释放事件
   if (event->button()==Qt::LeftButton)
   { //鼠标左键释放,获取矩形框的endPoint,进行缩放
      endPoint=event->pos();
      QRectF  rectF;
      rectF.setTopLeft(this->beginPoint);
      rectF.setBottomRight(this->endPoint);
      this->chart()->zoomIn(rectF);
   }
   else if (event->button()==Qt::RightButton)
      this->chart()->zoomReset(); //鼠标右键释放,resetZoom
   QChartView::mouseReleaseEvent(event);
}
void QWChartView::keyPressEvent(QKeyEvent *event)
{//按键控制
   switch (event->key()) {
   case Qt::Key_Plus:  
      chart()->zoom(1.2);      break;
   case Qt::Key_Minus:
      chart()->zoom(0.8);      break;
   case Qt::Key_Left:
      chart()->scroll(10, 0);      break;
   case Qt::Key_Right:
      chart()->scroll(-10, 0);     break;
   case Qt::Key_Up:
      chart()->scroll(0, -10);     break;
   case Qt::Key_Down:
      chart()->scroll(0, 10);      break;
   case Qt::Key_PageUp:
      chart()->scroll(0, 50);      break;
   case Qt::Key_PageDown:
      chart()->scroll(0, -50);      break;
   case Qt::Key_Home:
      chart()->zoomReset();       break;
   default:
      QGraphicsView::keyPressEvent(event);
    }
}

在构造函数里,setDragMode(QGraphicsView::RubberBandDrag)将视图组件鼠标拖动选择方式设置为“橡皮框”形式,即鼠标左键按下时,随着鼠标拖动显示一个矩形选择框。

setMouseTracking(true)将鼠标跟踪设置为true(缺省为false)。如果不设置为true,窗口组件只在某个鼠标按键按下时才接收鼠标移动事件,设置为true之后,只要鼠标移动就会发射mouseMoveEvent()事件。

mousePressEvent(QMouseEvent *event)是在鼠标左键或右键按下时发生的事件,在响应程序里先判断鼠标左键是否按下,如果是鼠标左键按下了,就用变量beginPoint记录鼠标在视图组件中的位置。

mouseReleaseEvent(QMouseEvent *event)是在鼠标左键或右键释放时发生的事件,若是鼠标左键释放,则用变量endPoint记录鼠标位置坐标,beginPoint和endPoint就定义了鼠标框选的矩形区域,用关联的chart组件的zoomIn()函数显示这个矩形区域实现放大。

mouseMoveEvent(QMouseEvent *event)是鼠标在图表上移动时发生的事件,通过event->pos()获取鼠标在视图组件中的坐标point,然后发射信号mouseMovePoint(point)。在使用QWChartView类组件的主窗口里,可以定义槽函数对此信号作出响应,通过传递的参数将视图坐标转换为图表的坐标,从而实现鼠标位置的数值显示。

keyPressEvent(QKeyEvent *event)是键盘按键按下时发生的事件,从event->key()可以获得按下按键的名称,判断按键,然后做出缩放、移动等操作。

QChart::zoom(qreal factor)函数对图表显示区的内容进行缩放,factor大于1是放大,小于1是缩小,缩放后坐标轴的范围会自动变化。

QChart::scroll(qreal dx, qreal dy)函数将图表内容在平面上平移,平移后坐标轴会自动变化。

QChart::zoomReset()函数将取消所有缩放变化,恢复原始的大小。