當QCustomplot上有兩條以上的曲線,怎么實現點擊某一條曲線就查看這條曲線上的點呢?
效果如圖:
可以分成兩步解決
首先是要能查看一條曲線的點,這個qcustomplot有專門的一個QCPItemTracer類來實現。
鼠標移動實現只需重寫mouseMoveEvent事件即可,
然后是要實現多條曲線選中某一條,QCustomplot也給出了實現方法:
setInteractions(QCP::iSelectPlottables);//設置曲線可選
在鼠標移動事件中加入曲線選擇判斷條件,並通過setGraph函數將錨點和曲線連接起來即可。
頭文件:
protected: virtual void mouseMoveEvent(QMouseEvent *event); private: QCPItemTracer *tracer;
構造函數中:
tracer = new QCPItemTracer(this);
tracer->setInterpolating(false);
tracer->setStyle(QCPItemTracer::tsCircle);
tracer->setPen(QPen(Qt::red));
tracer->setBrush(Qt::red);
tracer->setSize(6);
setInteractions(QCP::iSelectPlottables);
mouseMoveEvent事件中:
QCPGraph *mGraph = graph(0); //得到錨點的像素坐標 QPointF temp = tracer->position->coords(); //將像素點轉換成qcustomplot中的坐標值,並通過setGraphKey將錨點值設為真實數據值。
tracer->setGraphKey(xAxis->pixelToCoord(event->pos().x())); //遍歷曲線 for (int i = 0; i < graphCount(); ++i) { //判斷哪一條曲線被選中 if(graph(i)->selected()) { //顯示錨點 tracer->setVisible(true); mGraph = graph(i); //顯示tip框 QToolTip::showText(event->globalPos(), tr( "<h4>%L1</h4>" "<table>" "<tr>" "<td><h5>X: %L2</h5></td>" "<td> , </td>" "<td><h5>Y: %L3</h5></td>" "</tr>" "</table>").arg(mGraph->name()).arg( QString::number( temp.x(), 'g' ) ).arg( QString::number( temp.y(), 'g' ) ), this, this->rect()); break; } else { //沒有曲線被選中,不顯示錨點 tracer->setVisible(false); }
} //將錨點設置到被選中的曲線上 tracer->setGraph(mGraph); //重繪 replot();