標記點
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();
}
}
}