QCustomPlot鼠标点选折线上的

本帖子原创作者:清澈的眼神@xiaoniede。转载注明原创作者地址。欢迎大家一起讨论技术问题。学习交流QQ群:498278174
 
     不多说直接上效果图:
图1:[attachment=15215]
 
图2:
 
实现思路参考qt Charts下例子:scatterinteractions。
void   Dialog::initCustomplot(){     
     ///鼠标点击的有效距离,越小越准确。     
     ui-> customplot->setSelectionTolerance( 5);   
     ///设置用户交互
      ui-> customplot->setInteractions( QCP:: iRangeDrag       
                                                      |   QCP:: iRangeZoom                                       
                                                      |   QCP:: iMultiSelect                                       
                                                      |   QCP:: iSelectOther                                       
                                                      |   QCP:: iSelectItems                                       
                                                    /*|   QCP::iSelectPlottables*/                                     
                                                      );
     ///set   X   Axis     
     ui-> customplot-> xAxis->setRange( 0,   100);
     ///set   Y   Axis     
     ui-> customplot-> yAxis->setRange(- 50,   50);     
     ui-> customplot-> yAxis->setAutoTickCount( 2);   ///设定自动显示的标签个数
     ///设置自动步长,方便区间控制     
     ui-> customplot-> yAxis->setAutoTickStep( false);     
     ui-> customplot-> yAxis->setTickStep( 50.0);

     ///释放鼠标处理     
    connect( ui-> customplot,   SIGNAL(mouseRelease( QMouseEvent*)),    
                this,   SLOT(slot_mouseRelese( QMouseEvent*)));
    ///添加文本标签
     m_pMousValue  =   new   QCPItemText( ui-> customplot);     
     ui-> customplot->addItem( m_pMousValue);     
     m_pMousValue->setPositionAlignment( Qt:: AlignTop| Qt:: AlignHCenter);     
     m_pMousValue-> position->setType( QCPItemPosition:: ptAxisRectRatio);     
     m_pMousValue-> position->setCoords( 0.5,   0);   //   place   position   at   center/top   of   axis   rect     
     m_pMousValue->setText( "Text   Item   Value");      m_pMousValue->setFont( QFont(font().family(),   16));   //   make   font   a   bit   larger     
     m_pMousValue->setPen( QPen( Qt:: red));   //   show   black   border   around   text
        ///具体思路如下:两条折线图,一条实线的折线图,一条散点的折线图     
         ui-> customplot->addGraph();    
          ui-> customplot->graph( 0)->setPen( QPen( Qt:: red,   2));     
          ui-> customplot->graph(0)->setSelectedPen( QPen( Qt:: blue,   2));     
           ui-> customplot->graph( 0)->setLineStyle( QCPGraph:: lsLine);      ///步骤2   新建一条散点图     
          
          QCPScatterStyle  myScatter;     
          myScatter.setShape( QCPScatterStyle:: ssDisc);     
          myScatter.setPen( QPen( Qt:: blue));     
          myScatter.setBrush( QBrush( Qt:: white));     
          myScatter.setSize( 5);     
           ui-> customplot->addGraph();     
           ui-> customplot->graph( 1)->setLineStyle( QCPGraph:: lsNone);     
           ui-> customplot->graph( 1)->setScatterStyle(myScatter);

     QVector< double>  dVctValue;     
      QVector< double>  dVctKeys;     
      int  dequlNum  =  qrand()% 10* 50;     
      if(dequlNum  ==   0){         dequlNum  =   50;     }    
      int  n  =   50;     
     for( int  i  =   0;  i  <  n;  i++)     {
        dVctValue.append(qrand()%dequlNum);         
        dVctKeys.append(i* 2);    
     }     
      ui-> customplot->graph( 0)-> clearData();     
      ui-> customplot->graph( 0)->addData(dVctKeys,  dVctValue);     
      ui-> customplot->graph( 0)->rescaleValueAxis();
}
 
void   Dialog::slot_mouseRelese( QMouseEvent  *event){     
    ///排除非左鼠标键     
     if  (event->button()  !=   Qt:: LeftButton){          return;     }
    
    QPointF  ChickedPoint  =  event->posF();     
     ///排除区间外鼠标点     
     if(! ui-> customplot->viewport().contains(event->pos())){          return;     }

     QPointF  closest( INT_MAX,   INT_MAX);     
      qreal  distance( INT_MAX);
      QCPDataMap*  m_graphDataMap1  =   ui-> customplot->graph( 0)->data();     
      QCPDataMapIterator  itr(*m_graphDataMap1);      
      while(itr.hasNext()){         
           itr.next();
           qreal  dPosX  =   ui-> customplot-> xAxis->coordToPixel(itr.key());     
           qreal  dPosY  =   ui-> customplot-> yAxis->coordToPixel(itr.value(). value);  

            QPointF  currentPoint(dPosX,  dPosY);
            qreal  currentDistance  =  qSqrt((currentPoint.x()-ChickedPoint.x())  *  (currentPoint.x()-ChickedPoint.x())  +   
                             (currentPoint.y()-ChickedPoint.y())  *  (currentPoint.y()-ChickedPoint.y()));

         if(currentDistance  <  distance){  
           distance  =  currentDistance;  
           closest   =  currentPoint;
        }  
   }    
     ///可放开调试信息,观察鼠标点击到折线的距离。
    ///qDebug()<< "------pos-------"<<distance;     
     if(distance  >   ui-> customplot->selectionTolerance()){          return;     }

      double  dKey  =   ui-> customplot-> xAxis->pixelToCoord(closest.x());  
      double  dValue  =   ui-> customplot-> yAxis->pixelToCoord(closest.y());

    ///添加到散点折线图中
     ui-> customplot->graph( 1)->removeData(dKey);
     ui-> customplot->graph( 1)->addData(dKey,  dValue);
     m_pMousValue->setText( QString( "X:   %1,   Y:   %2").arg(dKey).arg(dValue));
}
 本帖子原创作者:清澈的眼神@xiaoniede。转载注明原创作者地址。欢迎大家一起讨论技术问题。学习交流QQ群:498278174
 
 
 
 
 
 
 
 
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值