QCustomplot的基本使⽤⽅法
QCustomplot的基本使⽤⽅法
最近在写⼀个程序需要画图,原本使⽤的是qtcharts,但是有可能是我使⽤⽅法没对,⽤qtcharts画图的效率极其低下,上万个点时,尤其是可能卡死,后来听说qcustomplot好⽤,于是改⽤qcustomplot,果不其然,⼀万多个点,⼏乎秒出。
qcustomplot的使⽤⽅法与qtchart不太相同,因此记录⼀⼆。
我所使⽤的qcustomplot版本为2.0版本。
⼀、准备⼯作
qcustomplot使⽤过程中,有如下⼏个注意点:
1. 有⼏种使⽤⽅法,我采⽤的是,将qcustomplot.h与qcustomplot.cpp放置⼯程⽂件下,⽽后导⼊;
2. 修改pro⽂件,添加两个内容,⼀个是QT += printsupport,另⼀个是DEFINES += QCUSTOMPLOT_USE_OPENGL,前者的作⽤是为了使
⽤该控件,后者的作⽤是为了让画图过程中使⽤OpenGL以增加效率,另外,如果你是后来添加的DEFINES +=
QCUSTOMPLOT_USE_OPENGL则需要清除⼯程⽂件,重新构建,因为这部分内容需要写⼊预编译产⽣的⽂件中;
3. 在ui⽂件中,添加⼀个Widget的控件,提升为qcustomplot,这个需要⾃⼰⼿动将刚刚导⼊进来的qcustomplot添加到提升的类中。⼆、使⽤⽅法
该部分内容,直接贴代码,看注释。这是⼀个在dialog中通过提升Wdiget实现qcustomplot的⽅法。
头⽂件内容
#include<QDialog>
namespace Ui {
class precisionPaintDialog;
}
class precisionPaintDialog :public QDialog
{
Q_OBJECT
public:
explicit precisionPaintDialog(QWidget *parent =0);
~precisionPaintDialog();
void addGraphs();
QVector<double> x1;//图表1的X轴数据
QVector<double> c1;//图表1的Y轴数据
QVector<double> x2;//图表2的X轴数据
QVector<double> c2;//图表2的X轴数据
public slots:
//图表1的⿏标右键功能
void mouseReleaseEvent_plot1(QMouseEvent * event);
//图表2的⿏标右键功能
void mouseReleaseEvent_plot2(QMouseEvent * event);
private:
Ui::precisionPaintDialog *ui;
private slots:
void recover_btn_plot1();//图表1的恢复功能
void recover_btn_plot2();//图表2的恢复功能
void save_jpg_btn_plot1();//图表1的保存为jpg功能
void save_jpg_btn_plot2();//图表2的保存为jpg功能
};
cpp⽂件内容
#include"precisionpaintdialog.h"
#include"ui_precisionpaintdialog.h"
precisionPaintDialog::precisionPaintDialog(QWidget *parent):
QDialog(parent),
ui(new Ui::precisionPaintDialog)
{
ui->setupUi(this);
this->setWindowFlags(Qt::WindowMinMaxButtonsHint);
/
/图⽅便,我就⽤10000个相同的值的点来演⽰,反正数值⼤⼩⽆所谓。
for(int i =0; i<10000;i++){
x1.append(i);
exists的用法c1.append(0.01);
x2.append(i);
c2.append(0.02);
}
//将第⼀个widget控件的⿏标释放的信号与⾃⼰定义个⼀个函数相连接,为了⽅便使⽤,我⾃⾏定义了⼀个函数。
connect(ui->widget_plot,SIGNAL(mouseRelease(QMouseEvent*)),this,SLOT(mouseReleaseEvent_plot1(QMouseEvent*))); //将第⼆个widget控件的⿏标释放的信号与⾃⼰定义个⼀个函数相连接,为了⽅便使⽤,我⾃⾏定义了⼀个函数。
connect(ui->widget_plot_2,SIGNAL(mouseRelease(QMouseEvent*)),this,SLOT(mouseReleaseEvent_plot2(QMouseEvent*))); //实现添加图表及图表的配置,及图表的数据的函数。
addGraphs();
}
precisionPaintDialog::~precisionPaintDialog()
{
delete ui;
}
//图表的初始化函数
void precisionPaintDialog::addGraphs()
{
//这个是坐标轴的固有属性的⼀个策略类,利⽤该策略,可以实现指定坐标轴的⼀些属性,⽐如刻度步长,刻度数⽬等等。
QSharedPointer<QCPAxisTickerFixed>ticker(new QCPAxisTickerFixed);
//设置刻度步长为0.004
ticker.data()->setTickStep(0.004);
//设置坐标轴有9个刻度值
ticker.data()->setTickCount(9);
//新增⼀个图表
ui->widget_plot->addGraph();
//设置图表的名称
ui->widget_plot->graph()->setName("通道A随机误差");
//将横轴和纵轴的值赋值给坐标轴
ui->widget_plot->graph()->setData(x1, c1);
//设置X轴的标签
ui->widget_plot->xAxis->setLabel("相对时(秒)");
//设置Y轴的标签
ui->widget_plot->yAxis->setLabel("通道A随机误差");
//设置X轴的值的范围
ui->widget_plot->xAxis->setRange(x1.first(),x1.last());
//设置Y轴的值的范围
ui->widget_plot->yAxis->setRange(0,0.032);
//将刚⽣成的坐标轴的策略,设置到Y轴上
ui->widget_plot->yAxis->setTicker(ticker);
/
/设置该坐标轴可拖动,可缩放
ui->widget_plot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
//设置使⽤opengl画图
ui->widget_plot->setOpenGl(true);
//画图
ui->widget_plot->replot();
//图表2与图表1⼀模⼀样,不赘述
ui->widget_plot_2->addGraph();
ui->widget_plot_2->yAxis->ticker().data()->setTickCount(9);
ui->widget_plot_2->graph()->setName("通道B随机误差");
ui->widget_plot_2->graph()->setData(x2, c2);
ui->widget_plot_2->xAxis->setLabel("相对时(秒)");
ui->widget_plot_2->yAxis->setLabel("通道B随机误差");
ui->widget_plot_2->xAxis->setRange(x2.first(),x2.last());
ui->widget_plot_2->yAxis->setRange(0,0.032);
ui->widget_plot_2->yAxis->setTicker(ticker);
ui->widget_plot_2->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
ui->widget_plot_2->setOpenGl(true);
ui->widget_plot_2->replot();
}
//右键时显⽰右键菜单栏,并实现按钮功能
void precisionPaintDialog::mouseReleaseEvent_plot1(QMouseEvent *event)
{
if(event->button()==Qt::RightButton)
{
//新建⼀个菜单
QMenu *pMenu=new QMenu(ui->widget_plot);
//新建菜单中的按钮
QAction *act_Reset=new QAction(tr("复位"),ui->widget_plot);
QAction *act_Save_jpg=new QAction(tr("保存为jpg"),ui->widget_plot);
//将按钮添加到菜单
pMenu->addAction(act_Reset);
pMenu->addAction(act_Save_jpg);
/
/将按钮与实现的功能函数相绑定
connect(act_Reset,SIGNAL(triggered(bool)),this,SLOT(recover_btn_plot1()));
connect(act_Save_jpg,SIGNAL(triggered(bool)),this,SLOT(save_jpg_btn_plot1()));
//在右键点击的位置显⽰菜单
pMenu->exec(cursor().pos());
//释放内存
QList<QAction*>list=pMenu->actions();
foreach(QAction* pAction, list){
delete pAction;
}
delete pMenu;
}
}
//与上述⼀致
void precisionPaintDialog::mouseReleaseEvent_plot2(QMouseEvent *event)
{
if(event->button()==Qt::RightButton)
{
QMenu *pMenu=new QMenu(ui->widget_plot_2);
QAction *act_Reset=new QAction(tr("复位"),ui->widget_plot_2);
QAction *act_Save_jpg=new QAction(tr("保存为jpg"),ui->widget_plot_2);
pMenu->addAction(act_Reset);
pMenu->addAction(act_Save_jpg);
connect(act_Reset,SIGNAL(triggered(bool)),this,SLOT(recover_btn_plot2()));
connect(act_Save_jpg,SIGNAL(triggered(bool)),this,SLOT(save_jpg_btn_plot2()));
pMenu->exec(cursor().pos());
QList<QAction*>list=pMenu->actions();
foreach(QAction* pAction, list){
delete pAction;
}
delete pMenu;
}
}
/
/实现恢复图表初始化界⾯的功能
void precisionPaintDialog::recover_btn_plot1()
{
ui->widget_plot->xAxis->setRange(x1.first(),x1.last());
ui->widget_plot->yAxis->setRange(0,0.032);
ui->widget_plot->replot();
}
//实现保存为图输出的功能
void precisionPaintDialog::save_jpg_btn_plot1()
{
//保存的位置,如果不存在,则创建⽂件夹
QString path=QCoreApplication::applicationDirPath()+"/SavePicture/precision";
QDir dir(path);
if(!ists()){
dir.mkpath(path);
}
QString pathA = path +"/channelA_"+QTime::currentTime().toString().replace(":","")+".jpg";
//保存为jps输出,也可以保存为bmp,pdf,png等格式输出,相应的函数分别为saveBmp,savePdf,savePng。
if(ui->widget_plot->saveJpg(pathA)){
int click=QMessageBox::warning(this,"提⽰","图⽚已保存!是否打开保存⽬录?",QMessageBox::Yes,QMessageBox::No);
//打开图⽚所在⽬录的⽂件夹
if(click==QMessageBox::Yes){
QDesktopServices::openUrl(QUrl::fromLocalFile(path));
}
}else{
QMessageBox::information(this,"提⽰","图⽚保存失败!");
}
}
//同上类似
void precisionPaintDialog::recover_btn_plot2()
{
ui->widget_plot_2->xAxis->setRange(x2.first(),x2.last());
ui->widget_plot_2->yAxis->setRange(0,0.032);
ui->widget_plot_2->replot();
}
//同上类似
void precisionPaintDialog::save_jpg_btn_plot2()
{
QString path=QCoreApplication::applicationDirPath()+"/SavePicture/precision";
QDir dir(path);
if(!ists()){
dir.mkpath(path);
}
QString pathB = path +"/channelB_"+QTime::currentTime().toString().replace(":","")+".jpg";
if(ui->widget_plot->saveJpg(pathB)){
int click=QMessageBox::warning(this,"提⽰","图⽚已保存!是否打开保存⽬录?",QMessageBox::Yes,QMessageBox::No);
if(click==QMessageBox::Yes){
QDesktopServices::openUrl(QUrl::fromLocalFile(path));
}
}else{
QMessageBox::information(this,"提⽰","图⽚保存失败!");
}
}
三、总结
实现了如下功能:
1. 实现在⼀个dialog中使⽤多个qcustomplot提升的widget控件;
2. 实现指定坐标轴的刻度的步长;
3. 实现图表的缩放,平移;
4. 在右键添加多按钮,实现图表的恢复及输出。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。