QCustomPlot 標記點和文本標籤

標記點

1、含義:指向QCPGraph的數據點的Item
2、new一個新的標記點

m_sameTimeTracer = new QCPItemTracer(SameTimeCompareCustomPlot);
m_sameTimeTracer->setParent(SameTimeCompareCustomPlot); //設置標記點的父類
m_sameTimeTracer->setPen(QColor(255,255,255));
m_sameTimeTracer->setBrush(QBrush(QColor(255,0,0),Qt::SolidPattern));
m_sameTimeTracer->setStyle(QCPItemTracer::tsCircle);    //設置標記點的樣式
m_sameTimeTracer->setSize(10);  //標記點的大小
m_sameTimeTracer->setVisible(false);

3、思路:
循環遍歷當前曲線的數據點,並將數據點的座標與鼠標點擊的位置座標進行對比,當鼠標點擊的位置在數據點附近的小範圍內,則標記該數據點爲標記點

QRect rect(0,0,1,1);    //設置小矩形框作爲數據點附近的範圍
QPoint p;
double posKey;
p.setX(e->pos().x());
p.setY(e->pos().y());
foreach(QCPData data,graph->data()->values())
{
      key = data.key;
      value = data.value;
      posKey = SameTimeCompareCustomPlot->xAxis->coordToPixel(key);
      if(qAbs(posKey-e->pos().x())<=10)
      {
         double posx = graph->keyAxis()->coordToPixel(key);
         double posy = graph->valueAxis()->coordToPixel(value);
         rect.setRect(posx-10,posy-10,21,21);
         if(!rect.contains(e->pos()))
            continue;
          else
             break;
       }
      if(posKey-e->pos().x()>10)
         break;
}

if(rect.contains(e->pos())) //繪製
{
    m_sameTimeTracer->setGraph(graph);
    m_sameTimeTracer->setGraphKey(key);
    m_sameTimeTracer->setVisible(true);
    pressPos.setX(key);
    pressPos.setY(value);
    SameTimeCompareCustomPlot->replot();
 }

文本標籤

1、文本標籤可以在用戶點擊數據點是顯示該點的數據等功能。
2、new一個新的文本標籤

m_sameTimeTextTip = new QCPItemText(SameTimeCompareCustomPlot);      
m_sameTimeTextTip->setPositionAlignment(Qt::AlignTop|Qt::AlignHCenter);   m_sameTimeTextTip->position->setType(QCPItemPosition::ptAbsolute);
QFont font;
font.setPixelSize(10);
m_sameTimeTextTip->setFont(font); // make font a bit larger
m_sameTimeTextTip->setPen(QPen(Qt::black)); // show black border around text
m_sameTimeTextTip->setBrush(Qt::white);
m_sameTimeTextTip->setVisible(false);

3、得到點擊的點的數據即可展示

m_sameTimeTextTip->setText("X軸: "+QString::number(pressPos.x()) +"\nY軸: "+QString::number(pressPos.y(),'f',3));
m_sameTimeTextTip->position->setCoords(e->pos().x()-30,e->pos().y()+15);
m_sameTimeTextTip->setVisible(true);
SameTimeCompareCustomPlot->replot();

代碼

connect(SameTimeCompareCustomPlot, SIGNAL(mousePress(QMouseEvent *)), this, SLOT(slot_SameTimeMousePressEvent4Plot(QMouseEvent*)));

/**
 *  獲取選中點的數值
 * @brief CADBCompareView::slot_SameTimeMousePressEvent4Plot
 * @param e
 */
void CADBCompareView::slot_SameTimeMousePressEvent4Plot(QMouseEvent *e)
{
    QCPGraph *graph = qobject_cast<QCPGraph*>(SameTimeCompareCustomPlot->plottableAt(e->pos(),true));
    QPointF pressPos(0,0);//跟蹤鼠標點擊事件點擊位置
    QRect rect(0,0,1,1);
    double key = 0,value = 0;
    if(graph)
    {
        if(m_sameTimeTracer == NULL)
        {
            m_sameTimeTracer = new QCPItemTracer(SameTimeCompareCustomPlot);
            m_sameTimeTracer->setParent(SameTimeCompareCustomPlot);
            m_sameTimeTracer->setPen(QColor(255,255,255));
            m_sameTimeTracer->setBrush(QBrush(QColor(255,0,0),Qt::SolidPattern));
            m_sameTimeTracer->setStyle(QCPItemTracer::tsCircle);
            m_sameTimeTracer->setSize(10);
            m_sameTimeTracer->setVisible(false);
        }
        if(m_sameTimeTextTip == NULL)
        {
            m_sameTimeTextTip = new QCPItemText(SameTimeCompareCustomPlot);
            m_sameTimeTextTip->setPositionAlignment(Qt::AlignTop|Qt::AlignHCenter);
            m_sameTimeTextTip->position->setType(QCPItemPosition::ptAbsolute);
            QFont font;
            font.setPixelSize(10);
            m_sameTimeTextTip->setFont(font); // make font a bit larger
            m_sameTimeTextTip->setPen(QPen(Qt::black)); // show black border around text
            m_sameTimeTextTip->setBrush(Qt::white);
            m_sameTimeTextTip->setVisible(false);
        }
        QPoint p;
        double posKey;
        p.setX(e->pos().x());
        p.setY(e->pos().y());
        foreach(QCPData data,graph->data()->values())
        {
            key = data.key;
            value = data.value;
            posKey = SameTimeCompareCustomPlot->xAxis->coordToPixel(key);
            if(qAbs(posKey-e->pos().x())<=10)
            {
                double posx = graph->keyAxis()->coordToPixel(key);
                double posy = graph->valueAxis()->coordToPixel(value);
                rect.setRect(posx-10,posy-10,21,21);
                if(!rect.contains(e->pos()))
                    continue;
                else
                    break;
            }
            if(posKey-e->pos().x()>10)
                break;
        }
        if(!graph->realVisibility())
        {
            m_sameTimeTracer->setVisible(false);
            pressPos.setX(0);
            pressPos.setY(0);
            SameTimeCompareCustomPlot->replot();
        }else if(rect.contains(e->pos()))
        {
            m_sameTimeTracer->setGraph(graph);
            m_sameTimeTracer->setGraphKey(key);
            m_sameTimeTracer->setVisible(true);
            pressPos.setX(key);
            pressPos.setY(value);
            SameTimeCompareCustomPlot->replot();
        }else
        {
            if(m_sameTimeTracer->visible())
            {
                m_sameTimeTracer->setVisible(false);
                pressPos.setX(0);
                pressPos.setY(0);
                SameTimeCompareCustomPlot->replot();
            }
        }
    }else
    {
        if(!m_sameTimeTracer == NULL)
        {
            if(m_sameTimeTracer->visible())
            {
                m_sameTimeTracer->setVisible(false);
                pressPos.setX(0);
                pressPos.setY(0);
                SameTimeCompareCustomPlot->replot();
            }
        }
    }

    if(pressPos.x()!=0 && pressPos.y()!=0)
    {
        m_sameTimeTextTip->setText("X軸: "+QString::number(pressPos.x()) +"\nY軸: "+QString::number(pressPos.y(),'f',3));
        m_sameTimeTextTip->position->setCoords(e->pos().x()-30,e->pos().y()+15);
        m_sameTimeTextTip->setVisible(true);
        SameTimeCompareCustomPlot->replot();
    }else
    {
        if(m_sameTimeTextTip != NULL)
        {
            m_sameTimeTextTip->setVisible(false);
            SameTimeCompareCustomPlot->replot();
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章