本文记录了在Linux上使用QCustomPlot进行一个基本绘制所需的完整过程,包括如何使用qtcreator,编辑ui以及编写相应的C++代码。以下是详细步骤:
1、使用qtcreator启动开发环境:
[blctrl@main-machine qt]$ qtcreator
启动后,显示以下一个操作界面:
2、通过菜单栏File->New File or Project启动项目新建向导:
3、选择Application->Qt Widgets Application后点击Choose,进入以下一个窗口:
填入自己的项目名称并且选择项目存储路径,勾选复选项,点击Next按钮。
4、在接下来出现的对话框中,都点击next按钮,直到遇到带有finish按钮的对话框,点击finish后,完成项目创建。
在点击最后一个对话框中finish按钮后,出现以下一个界面:
5、复制下载的QCustomPlot头文件和源文件到这个项目路径下:
[blctrl@main-machine qt]$ cd plot
[blctrl@main-machine plot]$ ls
main.cpp mainwindow.cpp mainwindow.h mainwindow.ui plot.pro plot.pro.user
[blctrl@main-machine plot]$ cp ../qcustomplot/qcustomplot.* ./
[blctrl@main-machine plot]$ ls
main.cpp mainwindow.cpp mainwindow.h mainwindow.ui plot.pro plot.pro.user qcustomplot.cpp qcustomplot.h
6、修改plot.pro文件,内容如下:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport
greaterThan(QT_MAJOR_VERSION, 4): CONFIG += c++11
lessThan(QT_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=c++11
TARGET = plot
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp \
qcustomplot.cpp
HEADERS += mainwindow.h \
qcustomplot.h
FORMS += mainwindow.ui
7、保存以上文件后,项目窗口中,Sources和Headers分别增加了一个qcustomplot.cpp源文件和qcustomplot.h头文件。
8、双击项目下Forms中mainwindow.ui文件,弹出一个图形编辑窗口:
9、点击控件,将Containers下Widget控件拖动到所编辑窗口上。将鼠标放置在空白窗口区,点击水平布局。此时,被拖入的widget将占据整个窗口的客户区。
10、点击被拖入的widget,然后右键单击鼠标,在弹出环境菜单中,选择Promoto to...选项,在弹出的对话框中Promoted Class栏输入QCustomPlot,点击Promote按钮。
11、将属性窗口中,objectName从widget改成customPlot。
12、编辑头文件mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include "qcustomplot.h" // 添加QCustomPlot类的头文件
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void setupDemo(QCustomPlot * customPlot); //编辑一个进行绘制的成员函数
private:
Ui::MainWindow *ui;
QString demoName; // 添加一个成员变量
};
#endif // MAINWINDOW_H
13、编辑头文件mainwindow.cpp源文件:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setGeometry(400, 250, 542, 390);
setupDemo(ui->customPlot);
}
MainWindow::~MainWindow()
{
delete ui;
}
// 绘图成员函数的实现
void MainWindow::setupDemo(QCustomPlot * customPlot)
{
demoName = "Simple Plot Demo";
// 产生数据:
// 进行初始化
QVector x(101), y(101);
for (int i=0; i<101; ++i)
{
x[i] = i/50.0 - 1; // x从-1到1
y[i] = x[i]*x[i]; // 绘制2次函数
}
// 创建图形并且将数据赋给它:
customPlot->addGraph();
customPlot->graph(0)->setData(x, y);
// 设置轴的标签:
customPlot->xAxis->setLabel("x");
customPlot->yAxis->setLabel("y");
// 设置轴的范围,因而可以看到全部数据:
customPlot->xAxis->setRange(-1, 1);
customPlot->yAxis->setRange(0, 1);
// 设置窗口标题栏名称
setWindowTitle("QCustomPlot: " + demoName);
statusBar()->clearMessage();
ui->customPlot->replot();
}
14、点击编译,编辑成功后,点击运行按钮:
15、显示运行如下的程序:
本教程将customPlot用作指向QCustomPlot实例地指针。如果你已经在QCreator中提升了一个widget,并且将其名称更改为customPlot后,你将可以通过ui->customPlot访问这个widget。
你可以通过customPlot->addGraph()创建一个新图形。接着例如通过customPlot->graph(0)->setData(...)为这个图形分配一些数据点,例如为X和Y(键和值)用QVector(double)地形式。QCustomPlot使用术语键和值而不是x和y的原因是在分配哪个轴有什么角色中更加灵活。因而如果你定义左轴为"键轴"和底轴为"值轴",你可以绘制一张在绘图左面直立的图形。默认,QCustomPlot widget有类型QCPAxis的四个轴:customPlot->xAxis, yAxis, xAxis2和yAxis2,对应底、左,上和右轴。它们的范围定义了绘图哪部分当前可见:customPlot->xAxis->setRange(-1, 1);
要使得绘图的任何类型编号显示在屏幕上,调用customPlot->replot()。注意:当wiget尺寸变化时以及当内建用户交互被触发时,将自动发生重绘。这样的用户交互例如用鼠标拖动轴范围以及用鼠标滚轮缩放。
由这个轴当前使用的轴ticker,自动选择刻度步长和标签。这是类型QCPAxisTicker的实例,并且例如通过xAxis->ticker()是可访问的。你可以通过xAxis->ticker()->setTickCount(6)调整ticker尝试创建的近似刻度数。默认的轴ticker很适合于简单的数值显示,然而有专用的类,例如,用于时间跨度,日历日期,类别,pi(或者其它符号单位)以及对数轴。详细见QCPAxisTicker。
Axes的刻度标签(数值)不超出这个widget的边框,即使当它们变得更宽。这是由于自动的边缘计算,默认其被开启。如果刻度标签和axis标签需要更多空间,它使得axis矩形收缩。如果你不想要边沿被自动确定,通过调用customPlot->axisRect()->setAutoMargins(QCP::msNone)禁用这种行为。接着你可以通过customPlot->axisRect()->setMargin(..)手动调整边沿。
1)图形:图形外观具有很多因素的特点,它们都可以被修改。以下是重要的因素:
2)轴:通过修改绘制axis使用的笔以及它们的标签使用的字体修改axis的外观。查看QCPAxis的文档见其解释。这是一个最重要属性的概要:SetBasePen, setTickPen, setTickLength, setSubTickLength, setSubTickPen, setTickLabelFont, setLableFont, setTickLabelPadding, setLabelPadding。你可以用setRangeReversed反向一个axis(例如:使得从左到右值递减而不是递增)。如果你在轴末尾想要装饰(例如,箭头),使用SetLowerEnding或setUpperEnding。
3)网格线:通过访问一个轴各自QCPGrid实例修改这个网格。例如,通过访问customPlot->yAxis->grid(),更改网格水平线(其被绑定到左轴)的外观。网格线的外观基本上是绘制它们使用的笔,通过yAxis->grid()->setPen()设置它。在刻度0的网格线可以用不同笔绘制,用setZeroLinePen设置它。如果你不想要用特殊笔绘制0线,只要设置它为Qt::NoPen,并且在刻度0处的网格线将用正常网格笔绘制。子网格线默认被设为不可见。通过grid()->setSubGridVisible(true)激活它们。