一、历史对比
关于QCPLayoutElement这个元素的讲解之前,我想先对1.3.2release版本和2.0.0beta版本的该元素做以简单的对比介绍,首先,1.3.2release版本时,鼠标单击时,如果按下的位置是一个布局元素,那么QCustomPlot首先会把这个事件回调给该被点击的元素,并且mouse系列的方法都是这样传递给QCPLayoutElement对象,该布局元素的声明会像这样QPointer<QCPLayoutElement> mMouseEventElement;但是到了2.0.0beta版本时,QCustomPlot源码做出了很大的调整,不仅仅是QCPLayoutElement布局元素可以接收鼠标事件,凡事继承自QCPLayerable类的元素都可以支持鼠标事件,因为mouse一系列的方法被移到了QCPLayerable类中。下面我分别贴出这两个版本时的mousePressEvent处理方法
1.3.2release版本鼠标按下处理方式
1 void QCustomPlot::mousePressEvent(QMouseEvent *event) 2 { 3 emit mousePress(event); 4 mMousePressPos = event->pos(); // need this to determine in releaseEvent whether it was a click (no position change between press and release) 5 6 // call event of affected layout element: 7 mMouseEventElement = layoutElementAt(event->pos());//后去当前选中布局元素 并调用其相关接口 8 if (mMouseEventElement) 9 mMouseEventElement->mousePressEvent(event); 10 11 QWidget::mousePressEvent(event); 12 }
2.0.0beta版本鼠标按下处理方式
1 void QCustomPlot::mousePressEvent(QMouseEvent *event) 2 { 3 emit mousePress(event); 4 // save some state to tell in releaseEvent whether it was a click: 5 mMouseHasMoved = false; 6 mMousePressPos = event->pos(); 7 8 if (mSelectionRect && mSelectionRectMode != QCP::srmNone)//优先处理鼠标绘制矩形事件 9 { 10 if (mSelectionRectMode != QCP::srmZoom || qobject_cast<QCPAxisRect*>(axisRectAt(mMousePressPos))) // in zoom mode only activate selection rect if on an axis rect 11 mSelectionRect->startSelection(event); 12 } 13 else 14 { 15 // no selection rect interaction, so forward event to layerable under the cursor: 16 QList<QVariant> details; 17 QList<QCPLayerable*> candidates = layerableListAt(mMousePressPos, false, &