Qt工作笔记-QCustomplot绘制表,实现输入定位功能

运行截图如下:



文件结构图如下:



代码如下:

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

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/80630895