Qt使用QCustomPlot开发

 

 

1、下载源文件http://www.qcustomplot.com/

2、把.cpp和.h放在工程目录下,并将cpp和h加入工程;

3、在.pro中:QT += printsupport;

4、在ui中添加一个Widget,右键提升为,输入:QCustomPlot,改变对象名称为customPlot;

5、加入代码:

void MainWindow::initUi()

{

QVector<double> x(101), y(101); // initialize with entries 0..100

for (int i=0; i<101; ++i)

{

x[i] = i/50.0 - 1; // x goes from -1 to 1

y[i] = x[i]*x[i]; // let's plot a quadratic function

}

ui->customPlot->addGraph();// 添加数据曲线(一个图像可以有多个数据曲线),graph(0);可以获取某个数据曲线(按添加先后排序);默认x1,y1轴

ui->customPlot->addGraph(ui->customPlot->xAxis,ui->customPlot->yAxis2);//添加的曲线以x1,y2为基准轴

ui->customPlot->graph(0)->setData(x, y);// setData();为数据曲线关联数据

ui->customPlot->xAxis->setLabel("x");// 为坐标轴添加标签

ui->customPlot->yAxis->setLabel("y");

ui->customPlot->xAxis->setRange(-1, 1);// 设置坐标轴的范围,以看到所有数据

ui->customPlot->yAxis->setRange(-1, 1);

ui->customPlot->replot();// 重画图像

//ui->customPlot->rescaleAxes();//自动设置最合适的显示范围

//ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);//可移动可拖放

//ui->customPlot->graph(0)->addData(double,double);//追加点

}

效果:

6:、添加QCustomPlot的帮助文档

在下载的源码包里有个qch文件,放在:D:\QT5.8\Docs\Qt-5.8里面,就可以使用帮助文档了

 

 

ps:

1、设置x坐标轴为时间

QSharedPointer<QCPAxisTickerTime> timeTicker(new QCPAxisTickerTime);
ui.customPlot->xAxis->setTicker(timeTicker);
ui.customPlot->xAxis->setRange(-60 * 3.5, 60 * 11);
timeTicker->setTimeFormat("%m:%s");

double secs = QCPAxisTickerDateTime::dateTimeToKey(QDateTime::currentDateTime());//横坐标

 2、设置位置

setPositionAlignment(Qt::AlignTop)

3、坐标轴样式

 

4、设置刻度高度

setTickLength

5、设置坐标轴样式

setUpperEnding

 6、设置两个线条之间填充

QCPGraph::setBrush(const QBrush &brush);  

graph->setChannelFillGraph(otherGraph)

7、设置曲线形状

QCPGraph::setScatterStyle(QCPScatterStyle &style);  

8、坐标轴相关参数命名

9、坐标区相关距离命名

  9.1、设置整个cp坐标轴距离左侧的距离

  ui.customPlot->yAxis->setPadding(40);//距离左边的距离

10、设置刻度label旋转

ui.customPlot->xAxis->setTickLabelRotation(60);

 11、设置坐标轴方向

ui.customPlot->xAxis->setRangeReversed(false);//x轴反向

 12、获取当前x、y轴range的左右值

realLeft = ui.customPlot->xAxis->range().lower;
realRight = ui.customPlot->xAxis->range().upper;

 二、高级

1、单级柱状图【只有一种颜色】

①、Bar声明

QCPBars *cpBar;

②、定义

cpBar = new QCPBars(ui.customPlot->xAxis, ui.customPlot->yAxis);

③、设置值

QVector<double> ticks;//定制值
ticks << 1 << 2 << 3 << 4;
QVector<double> yCount;

yCount<<2<<3<<3<<1;

cpBar->setData(ticks, yCount);
ui.customPlot->replot();

④、效果

 2、多级柱状图

先看效果【官网】

①、声明

QCPBars *max;
QCPBars *min;
QCPBars *sdDev;
QCPBars *varice;

②、定义

max = new QCPBars(ui.customPlot->xAxis, ui.customPlot->yAxis);
min = new QCPBars(ui.customPlot->xAxis, ui.customPlot->yAxis);
sdDev = new QCPBars(ui.customPlot->xAxis, ui.customPlot->yAxis);
varice = new QCPBars(ui.customPlot->xAxis, ui.customPlot->yAxis);

③、相关设置

max->setStackingGap(0);//设置上下bar之间的距离
min->setStackingGap(0);
sdDev->setStackingGap(0);
varice->setStackingGap(0);
max->setAntialiased(false); //提供更清晰、像素对齐的条形边框
min->setAntialiased(false);
sdDev->setAntialiased(false);
varice->setAntialiased(false);

sdDev->moveAbove(varice);//必须要写和这个,不然不会重叠
min->moveAbove(sdDev);//设置位置
max->moveAbove(min);

④、设置值

QVector<double> ticks;//定制值
ticks << 1 << 2 << 3 << 4;
QVector<double> yCount;

yCount<<2<<3<<3<<1;

max->setData(ticks, yCount);

min->setData(ticks, yCount);

varice->setData(ticks, yCount);

sdDev->setData(ticks, yCount);
ui.customPlot->replot();

 3、更好看的网格线

①、默认

 

②、定制

ui.customPlot->xAxis->grid()->setVisible(true);
ui.customPlot->xAxis->grid()->setPen(QPen(QColor(130, 130, 130), 0, Qt::DotLine));

ui.customPlot->yAxis->grid()->setSubGridVisible(true);
ui.customPlot->yAxis->grid()->setPen(QPen(QColor(130, 130, 130), 0, Qt::SolidLine));
ui.customPlot->yAxis->grid()->setSubGridPen(QPen(QColor(130, 130, 130), 0, Qt::DotLine));

4、鼠标事件

头文件中:

void myMousePressEvent(QMouseEvent *event);
void myMouseReleaseEvent(QMouseEvent *event);

 绑定:

connect(ui.customPlot, SIGNAL(mousePress(QMouseEvent*)), this, SLOT(myMousePressEvent(QMouseEvent*)));
connect(ui.customPlot, SIGNAL(mouseRelease(QMouseEvent*)), this, SLOT(myMouseReleaseEvent(QMouseEvent*)));

实现:

void RoadAllData::myMousePressEvent(QMouseEvent *event)
{
if (event->button() != Qt::LeftButton)return;//如果不是鼠标左键按下则返回

int x_pos = event->pos().x();
int y_pos = event->pos().y();

// 把鼠标坐标点 转换为 QCustomPlot 内部坐标值 (pixelToCoord 函数)
// coordToPixel 函数与之相反 是把内部坐标值 转换为外部坐标点
double x_val = ui.customPlot->xAxis->pixelToCoord(x_pos);
double y_val = ui.customPlot->yAxis->pixelToCoord(y_pos);

}

void RoadAllData::myMouseReleaseEvent(QMouseEvent *event)
{
  if (event->button() != Qt::LeftButton)return;
}

5、textitem的使用

①、声明

QCPItemText* itemText = NULL;

②、定义

itemText = new QCPItemText(ui.customPlot);
itemText->setPositionAlignment(Qt::AlignTop);
itemText->position->setType(QCPItemPosition::ptAxisRectRatio);
itemText->position->setCoords(0.5, 0); // place position at center/top of axis rect 
itemText->setFont(QFont(font().family(), 10)); // make font a bit larger
itemText->setTextAlignment(Qt::AlignLeft);
//itemText->setPen(QPen(Qt::red)); // show black border around text

③、设置值

itemText->setText("......"); 

 6、QSlider与显示range对应

**领导说,界面固定,用滑条来滑动。这都21世纪了,为什么要用20世纪的东西,不过行,**满足你,/微笑

①、使用QSlider,按下、释放、获取值

复制代码

    QObject::connect(ui.horizontalSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderMovedSlot(int)));
    QObject::connect(ui.horizontalSlider, SIGNAL(sliderPressed()), this, SLOT(sliderPressSlot()));
    QObject::connect(ui.horizontalSlider, SIGNAL(sliderReleased()), this, SLOT(sliderReleaseSlot()));

复制代码

②、通过设置range来显示Customplot当前位置

ui.customPlot->xAxis->setRange(realMax, realMax );
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值