运行截图如下:
文件结构图如下:
代码如下:
widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QVector> #include "qcustomplot.h" namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); void timerEvent(QTimerEvent *event); public slots: void btnClicked(); private: Ui::Widget *ui; QVector<double> m_x,m_y; QCPItemText *m_groupTracerText; QCPItemCurve *m_groupTracerArrow; int m_timerId; int m_timeNum; }; #endif // WIDGET_H
widget.cpp
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); for(int i=0;i<200;i++){ m_x.append(i); m_y.append(m_x[i]*m_x[i]*i); } this->setWindowTitle("CSDN IT1995"); ui->widget->addGraph(); ui->widget->graph()->setData(m_x,m_y); ui->widget->graph()->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, QPen(Qt::red, 3), QBrush(Qt::white), 22)); ui->widget->graph()->setPen(QPen(Qt::red,3)); ui->widget->setInteractions(QCP::iRangeDrag|QCP::iRangeZoom|QCP::iSelectLegend); ui->widget->xAxis->setBasePen(QPen(Qt::red, 1)); ui->widget->yAxis->setBasePen(QPen(Qt::red, 1)); ui->widget->xAxis->setSubTickPen(QPen(Qt::red, 1)); ui->widget->yAxis->setSubTickPen(QPen(Qt::red, 1)); ui->widget->xAxis->setTickLabelColor(Qt::red); ui->widget->yAxis->setTickLabelColor(Qt::red); ui->widget->xAxis->grid()->setPen(QPen(QColor(40, 40, 40), 1)); ui->widget->yAxis->grid()->setPen(QPen(QColor(40, 40, 40), 1)); ui->widget->xAxis->grid()->setSubGridPen(QPen(QColor(180, 180, 180), 1)); ui->widget->yAxis->grid()->setSubGridPen(QPen(QColor(180, 180, 180), 1)); m_groupTracerArrow = new QCPItemCurve(ui->widget); m_groupTracerText = new QCPItemText(ui->widget); QColor color(0, 0, 0); color.setAlphaF(0); m_groupTracerArrow->setPen(color); m_groupTracerText->setText(""); m_timeNum=0; ui->widget->replot(); connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(btnClicked())); m_timerId=startTimer(1000); } Widget::~Widget() { delete ui; } void Widget::timerEvent(QTimerEvent *event) { if(event->timerId()==m_timerId){ m_timeNum++; } if(m_timeNum>1){ QColor color(0, 0, 0); color.setAlphaF(0); m_groupTracerArrow->setPen(color); m_groupTracerText->setText(""); m_timeNum=0; ui->widget->replot(); } } void Widget::btnClicked() { ui->widget->xAxis->setRange(ui->spinBox->text().toInt()-10,ui->spinBox->text().toInt()+10); ui->widget->yAxis->setRange(m_y[ui->spinBox->text().toInt()]-10,m_y[ui->spinBox->text().toInt()]+10); m_groupTracerText->setColor(Qt::red); m_groupTracerText->position->setType(QCPItemPosition::ptAxisRectRatio); m_groupTracerText->setPositionAlignment(Qt::AlignRight|Qt::AlignTop); m_groupTracerText->position->setCoords(1.0, 0.20); m_groupTracerText->setText("就是这个点"); m_groupTracerText->setTextAlignment(Qt::AlignLeft); m_groupTracerText->setFont(QFont(font().family(), 9)); m_groupTracerText->setPadding(QMargins(8, 0, 0, 0)); m_groupTracerArrow->setPen(QPen(Qt::red)); m_groupTracerArrow->start->setParentAnchor(m_groupTracerText->left); m_groupTracerArrow->startDir->setParentAnchor(m_groupTracerArrow->start); m_groupTracerArrow->startDir->setCoords(-40, 0); m_groupTracerArrow->end->setCoords(m_x[ui->spinBox->text().toInt()],m_y[ui->spinBox->text().toInt()]); m_groupTracerArrow->endDir->setParentAnchor(m_groupTracerArrow->end); m_groupTracerArrow->endDir->setCoords(0, -40); m_groupTracerArrow->setHead(QCPLineEnding::esSpikeArrow); m_groupTracerArrow->setTail(QCPLineEnding(QCPLineEnding::esBar,(m_groupTracerText->bottom->pixelPosition().y()-m_groupTracerText->top->pixelPosition().y())*0.85)); ui->widget->replot(); }
main.cpp
#include "widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }